Skip to Content

Spring Boot (Java)

对于企业级 Java 应用,最稳健的集成方式是实现全局 HandlerInterceptor。这可确保所有传入的 HTTP 请求在抵达 Controller 控制器之前均完成安全核验。

拦截器实现

此实现安全提取反向代理之后的真实 IP(解析 X-Forwarded-For),使用 Java 原生 HttpClient 调用 ProxyTracer,并在标记为代理时直接阻断请求。
import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.time.Duration; @Component public class ProxyTracerInterceptor implements HandlerInterceptor { private static final String API_KEY = System.getenv("PROXYTRACER_API_KEY"); private final HttpClient httpClient = HttpClient.newBuilder() .connectTimeout(Duration.ofMillis(500)) // 严格的超时限制以避免产生性能瓶颈 .build(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 1. 安全提取负载均衡器/NGINX 背后的真实 IP String ipAddress = request.getHeader("X-Forwarded-For"); if (ipAddress == null || ipAddress.isEmpty()) { ipAddress = request.getRemoteAddr(); } else { ipAddress = ipAddress.split(",")[0].trim(); } // 2. 查询 ProxyTracer API HttpRequest ptRequest = HttpRequest.newBuilder() .uri(URI.create("https://api.proxytracer.com/v1/check/" + ipAddress)) .header("Authorization", "Bearer " + API_KEY) .GET() .build(); try { HttpResponse<String> ptResponse = httpClient.send(ptRequest, HttpResponse.BodyHandlers.ofString()); if (ptResponse.statusCode() == 200) { // 3. 简单字符串匹配(避免引入重量级 JSON 解析库以追求极致性能) if (ptResponse.body().contains("\"proxy\": true") || ptResponse.body().contains("\"proxy\":true")) { response.setStatus(HttpServletResponse.SC_FORBIDDEN); response.getWriter().write("{\"error\": \"Access Denied: VPN or Proxy detected.\"}"); response.setContentType("application/json"); return false; // 丢弃该请求 } } } catch (Exception e) { // 故障开放(Fail-open):记录错误并放行请求 System.err.println("ProxyTracer validation failed: " + e.getMessage()); } // 4. 流量正常,继续放行至控制器 return true; } }

配置说明:

请务必在 WebMvcConfigurer 配置类中注册该拦截器,以便将其全局应用于应用路由。

最后更新于