瀏覽代碼

网关用户真实ip获取

gaodm 5 年之前
父節點
當前提交
11cdafa72a
共有 1 個文件被更改,包括 32 次插入1 次删除
  1. 32 1
      gateway-service/src/main/java/com/diagbot/config/redislimiter/SysKeyResolver.java

+ 32 - 1
gateway-service/src/main/java/com/diagbot/config/redislimiter/SysKeyResolver.java

@@ -2,6 +2,7 @@ package com.diagbot.config.redislimiter;
 
 import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
 import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
+import org.springframework.http.HttpHeaders;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
@@ -33,7 +34,7 @@ public class SysKeyResolver implements KeyResolver {
             }
         }
 
-        String myKeyResolver = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()
+        String myKeyResolver = getIpAddress(exchange.getRequest())
                 + "_" + fullUrl;
         ServerHttpRequest.Builder builder = exchange.getRequest().mutate();
         builder.header("myKeyResolver", myKeyResolver);
@@ -41,4 +42,34 @@ public class SysKeyResolver implements KeyResolver {
 
         return Mono.just(exchange.getRequest().getHeaders().getFirst("myKeyResolver"));
     }
+
+    public static String getIpAddress(ServerHttpRequest request) {
+        HttpHeaders headers = request.getHeaders();
+        String ip = headers.getFirst("x-forwarded-for");
+        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
+            // 多次反向代理后会有多个ip值,第一个ip才是真实ip
+            if (ip.indexOf(",") != -1) {
+                ip = ip.split(",")[0];
+            }
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("X-Real-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddress().getAddress().getHostAddress();
+        }
+        return ip;
+    }
 }