Skip to Content
DocumentationBackendSpring Boot (Java)

Spring Boot (Java)

Para aplicaciones corporativas Java, la manera más robusta de integrar ProxyTracer es creando un HandlerInterceptor global. Esto garantiza que cada solicitud HTTP entrante se verifique antes de llegar a tus controladores.

El Interceptor

Esta implementación extrae con seguridad la IP desde el balanceador de carga (gestionando X-Forwarded-For), llama a ProxyTracer usando el HttpClient nativo de Java y bloquea la solicitud si detecta riesgo.
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)) // Tiempo de espera estricto para evitar cuellos de botella .build(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 1. Extraer de forma segura la IP real detrás de balanceadores de carga/NGINX String ipAddress = request.getHeader("X-Forwarded-For"); if (ipAddress == null || ipAddress.isEmpty()) { ipAddress = request.getRemoteAddr(); } else { ipAddress = ipAddress.split(",")[0].trim(); } // 2. Consultar la API de ProxyTracer 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. Coincidencia simple de cadenas (evita bibliotecas pesadas de análisis de JSON para máxima velocidad) 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; // Descarta la petición } } } catch (Exception e) { // Fail open: registrar el error y permitir el paso de la solicitud System.err.println("ProxyTracer validation failed: " + e.getMessage()); } // 4. El tráfico está limpio, continuar hacia el controlador return true; } }

Configuración:

No olvides registrar este interceptor en tu clase WebMvcConfigurer para aplicarlo de forma global a todas las rutas de tu aplicación.

Última actualización el