|
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