|
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