|  | 
| 10 | 10 | import java.net.InetAddress; | 
| 11 | 11 | import java.net.InetSocketAddress; | 
| 12 | 12 | import java.util.Optional; | 
|  | 13 | +import java.util.Set; | 
| 13 | 14 | 
 | 
| 14 | 15 | @Slf4j | 
| 15 | 16 | public class NetworkUtils { | 
| 16 | 17 | 
 | 
|  | 18 | +    private static final String[] CLIENT_IP_HEADERS = { "X-Forwarded-For", "X-Real-IP" }; | 
| 17 | 19 |     public static String getRemoteIp(ServerWebExchange serverWebExchange) { | 
| 18 | 20 |         ServerHttpRequest request = serverWebExchange.getRequest(); | 
| 19 | 21 |         HttpHeaders headers = request.getHeaders(); | 
| 20 |  | -        String xRealIp = headers.getFirst("X-Real-IP"); | 
| 21 |  | -        if (StringUtils.isNotBlank(xRealIp)) { | 
| 22 |  | -            return xRealIp; | 
| 23 |  | -        } | 
| 24 |  | -        String remoteIp = headers.getFirst("RemoteIp"); | 
| 25 |  | -        if (StringUtils.isNotBlank(remoteIp)) { | 
| 26 |  | -            return remoteIp; | 
|  | 22 | + | 
|  | 23 | +        /** Try to find remote id in headers **/ | 
|  | 24 | +        String foundHeader; | 
|  | 25 | +        for (String header : CLIENT_IP_HEADERS) { | 
|  | 26 | +            foundHeader = getMatchingKey(header, headers.keySet()); | 
|  | 27 | +            if (foundHeader != null) { | 
|  | 28 | +                log.debug("Found client IP in header: {}", foundHeader); | 
|  | 29 | +                return headers.getFirst(foundHeader); | 
|  | 30 | +            } | 
| 27 | 31 |         } | 
|  | 32 | + | 
| 28 | 33 |         log.debug("get remote ip from remoteAddress , header {}", JsonUtils.toJson(headers)); | 
| 29 | 34 |         return Optional.ofNullable(serverWebExchange.getRequest().getRemoteAddress()) | 
| 30 | 35 |                 .map(InetSocketAddress::getAddress) | 
| 31 | 36 |                 .map(InetAddress::getHostAddress) | 
| 32 | 37 |                 .orElse(""); | 
| 33 | 38 |     } | 
| 34 | 39 | 
 | 
|  | 40 | +    private static String getMatchingKey(String key, Set<String> keys) { | 
|  | 41 | +        return keys.stream() | 
|  | 42 | +                .filter(headerKey -> StringUtils.equalsIgnoreCase(key, headerKey)) | 
|  | 43 | +                .findFirst() | 
|  | 44 | +                .orElse(null); | 
|  | 45 | +    } | 
| 35 | 46 | } | 
0 commit comments