Jelajahi Sumber

+输出日志

lmx 2 minggu lalu
induk
melakukan
9e156f5d97

+ 48 - 12
ruoyi-admin/src/main/java/com/ruoyi/aicall/utils/ClientIpCheck.java

@@ -12,7 +12,6 @@ public class ClientIpCheck {
 
     public static Boolean checkIp(HttpServletRequest request){
         String clientIp = getClientIp(request);
-        log.info("get client ip:{}", clientIp);
         ICcParamsService ccParamsService = SpringUtils.getBean(ICcParamsService.class);
         String whiteIpList = ccParamsService.getParamValueByCode("api-client-white-ips", "");
         if (StringUtils.isNotEmpty(whiteIpList)) {
@@ -29,21 +28,58 @@ public class ClientIpCheck {
         return true;
     }
 
+    /**
+     * 解析客户端 IP,并打印诊断日志(XFF / X-Real-IP / remoteAddr / 选用源 / URI)。
+     * 用于排查偶发 172.17.0.1(docker0)与公网 IP 并存的问题。
+     */
     public static String getClientIp(HttpServletRequest request) {
-        String[] headers = {
-                "X-Forwarded-For",
-                "X-Real-IP",
-                "Proxy-Client-IP",
-                "WL-Proxy-Client-IP",
-                "HTTP_CLIENT_IP",
-                "HTTP_X_FORWARDED_FOR"
+        String xff = request.getHeader("X-Forwarded-For");
+        String xRealIp = request.getHeader("X-Real-IP");
+        String proxyClientIp = request.getHeader("Proxy-Client-IP");
+        String wlProxyClientIp = request.getHeader("WL-Proxy-Client-IP");
+        String httpClientIp = request.getHeader("HTTP_CLIENT_IP");
+        String httpXff = request.getHeader("HTTP_X_FORWARDED_FOR");
+        String remoteAddr = request.getRemoteAddr();
+        String uri = request.getRequestURI();
+        String query = request.getQueryString();
+
+        String[][] headerCandidates = {
+                {"X-Forwarded-For", xff},
+                {"X-Real-IP", xRealIp},
+                {"Proxy-Client-IP", proxyClientIp},
+                {"WL-Proxy-Client-IP", wlProxyClientIp},
+                {"HTTP_CLIENT_IP", httpClientIp},
+                {"HTTP_X_FORWARDED_FOR", httpXff}
         };
-        for (String h : headers) {
-            String value = request.getHeader(h);
+
+        String chosenSource = "remoteAddr";
+        String clientIp = remoteAddr;
+        for (String[] item : headerCandidates) {
+            String name = item[0];
+            String value = item[1];
             if (value != null && !value.isEmpty() && !"unknown".equalsIgnoreCase(value)) {
-                return value.split(",")[0].trim();
+                clientIp = value.split(",")[0].trim();
+                chosenSource = name;
+                break;
             }
         }
-        return request.getRemoteAddr();
+
+        log.info("get client ip:{}, source={}, X-Forwarded-For={}, X-Real-IP={}, remoteAddr={}, uri={}{}",
+                clientIp,
+                chosenSource,
+                emptyToDash(xff),
+                emptyToDash(xRealIp),
+                emptyToDash(remoteAddr),
+                uri,
+                query == null ? "" : ("?" + query));
+
+        return clientIp;
+    }
+
+    private static String emptyToDash(String value) {
+        if (value == null || value.isEmpty()) {
+            return "-";
+        }
+        return value;
     }
 }