From fea458d8768ad3c5496a02639577b8bace86a5a9 Mon Sep 17 00:00:00 2001 From: balex Date: Wed, 18 Feb 2026 20:15:11 +0100 Subject: [PATCH] fix: null-safe IP extraction in RequestLoggingFilter --- .../gateway/filter/RequestLoggingFilter.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/gateway-service/src/main/java/com/posthub/gateway/filter/RequestLoggingFilter.java b/gateway-service/src/main/java/com/posthub/gateway/filter/RequestLoggingFilter.java index 9c17ddf..23e50b6 100644 --- a/gateway-service/src/main/java/com/posthub/gateway/filter/RequestLoggingFilter.java +++ b/gateway-service/src/main/java/com/posthub/gateway/filter/RequestLoggingFilter.java @@ -9,6 +9,8 @@ import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; +import java.net.InetSocketAddress; + @Slf4j @Component public class RequestLoggingFilter implements GlobalFilter, Ordered { @@ -18,9 +20,7 @@ public class RequestLoggingFilter implements GlobalFilter, Ordered { ServerHttpRequest request = exchange.getRequest(); String method = request.getMethod().name(); String path = request.getURI().getPath(); - String clientIp = request.getRemoteAddress() != null - ? request.getRemoteAddress().getAddress().getHostAddress() - : "unknown"; + String clientIp = extractClientIp(request); log.info(">>> {} {} from {}", method, path, clientIp); @@ -35,8 +35,23 @@ public class RequestLoggingFilter implements GlobalFilter, Ordered { })); } + private String extractClientIp(ServerHttpRequest request) { + // Prefer X-Forwarded-For header set by Nginx + String xForwardedFor = request.getHeaders().getFirst("X-Forwarded-For"); + if (xForwardedFor != null && !xForwardedFor.isBlank()) { + return xForwardedFor.split(",")[0].trim(); + } + + InetSocketAddress remoteAddress = request.getRemoteAddress(); + if (remoteAddress != null && remoteAddress.getAddress() != null) { + return remoteAddress.getAddress().getHostAddress(); + } + + return "unknown"; + } + @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; } -} +} \ No newline at end of file