Skip to Content

Spring Boot (Java)

W korporacyjnych aplikacjach Java najbardziej niezawodnym sposobem integracji ProxyTracer jest utworzenie globalnego HandlerInterceptor. Gwarantuje to weryfikację każdego przychodzącego żądania HTTP przed dotarciem do kontrolerów.

Interceptor

Ta implementacja bezpiecznie pobiera adres IP zza load balancera (obsługując X-Forwarded-For), odpytuje ProxyTracer za pomocą natywnego HttpClient w Javie i blokuje żądanie w przypadku wykrycia zagrożenia.
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)) // Ścisły limit czasu, aby zapobiec powstawaniu wąskich gardeł .build(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 1. Bezpiecznie pobierz prawdziwy adres IP zza load balancerów / NGINX String ipAddress = request.getHeader("X-Forwarded-For"); if (ipAddress == null || ipAddress.isEmpty()) { ipAddress = request.getRemoteAddr(); } else { ipAddress = ipAddress.split(",")[0].trim(); } // 2. Odpytaj API 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. Proste dopasowywanie tekstu (Omija ciężkie parsery JSON dla maksymalnej szybkości) 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; // Odrzuca żądanie } } } catch (Exception e) { // Fail-open: Zaloguj błąd i przepuść żądanie System.err.println("ProxyTracer validation failed: " + e.getMessage()); } // 4. Ruch jest czysty, przekaż żądanie do kontrolera return true; } }

Konfiguracja:

Pamiętaj, aby zarejestrować ten interceptor w klasie implementującej WebMvcConfigurer, aby zastosować go globalnie do tras w aplikacji.

Ostatnia aktualizacja: