package com.battery.business.runtime;
|
|
import java.net.InetAddress;
|
import org.springframework.context.annotation.Configuration;
|
import org.springframework.web.servlet.HandlerInterceptor;
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletResponse;
|
|
/** 将临时 BTS 模拟器页面和控制 API 限制在本机。 */
|
@Configuration
|
public class BtsDevelopmentSimulatorWebConfig implements WebMvcConfigurer
|
{
|
/** 只为模拟器页面和控制 API 挂本机拦截器,其余路径不受影响。 */
|
@Override
|
public void addInterceptors(InterceptorRegistry registry)
|
{
|
registry.addInterceptor(new LocalOnlyInterceptor())
|
.addPathPatterns("/dev/bts-simulator.html", "/dev/bts-simulator/**");
|
}
|
|
public static final class LocalOnlyInterceptor implements HandlerInterceptor
|
{
|
@Override
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
|
throws Exception
|
{
|
if (isLoopback(request.getRemoteAddr())) return true;
|
response.sendError(HttpServletResponse.SC_FORBIDDEN, "BTS simulator controls are local-only");
|
return false;
|
}
|
|
private boolean isLoopback(String remoteAddress)
|
{
|
try
|
{
|
return remoteAddress != null && InetAddress.getByName(remoteAddress).isLoopbackAddress();
|
}
|
catch (Exception ignored)
|
{
|
return false;
|
}
|
}
|
}
|
}
|