Parcourir la source

修改ip返回

yusm il y a 4 semaines
Parent
commit
a05f97258b

+ 37 - 7
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WechatAccountController.java

@@ -35,6 +35,8 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.net.InetAddress;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -443,15 +445,43 @@ public class WechatAccountController {
 
 
     private String getUserIp(HttpServletRequest request) {
-        String ipAddress = request.getHeader("X-Forwarded-For");
-        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
-            ipAddress = request.getRemoteAddr();
+        // 1. 检查云服务商特殊头部
+        String ip = request.getHeader("X-Real-IP");
+        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("X-Forwarded-For");
         }
-        // 如果有多个 IP,取第一个
-        if (ipAddress != null && ipAddress.contains(",")) {
-            ipAddress = ipAddress.split(",")[0];
+        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
         }
-        return ipAddress;
+        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+
+        // 2. 处理多级代理
+        if (ip != null && ip.contains(",")) {
+            ip = Arrays.stream(ip.split(","))
+                    .map(String::trim)
+                    .filter(part -> !"unknown".equalsIgnoreCase(part))
+                    .findFirst()
+                    .orElse(null);
+        }
+
+        // 3. 最终回退
+        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+
+        // 4. 本地测试兼容
+        if ("0:0:0:0:0:0:0:1".equals(ip) || "127.0.0.1".equals(ip)) {
+            // 如果是本地测试,尝试从其他渠道获取(如网络接口)
+            try {
+                ip = InetAddress.getLocalHost().getHostAddress();
+            } catch (Exception e) {
+                ip = "127.0.0.1";
+            }
+        }
+
+        return ip;
     }
 
     private String getCityByIp(String ip) {

+ 36 - 7
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WechatCallbackController.java

@@ -22,6 +22,7 @@ import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -217,15 +218,43 @@ public class WechatCallbackController {
     }
     
     private String getClientIp(HttpServletRequest request) {
-        String ipAddress = request.getHeader("X-Forwarded-For");
-        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
-            ipAddress = request.getRemoteAddr();
+        // 1. 检查云服务商特殊头部
+        String ip = request.getHeader("X-Real-IP");
+        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("X-Forwarded-For");
         }
-        // 如果有多个 IP,取第一个
-        if (ipAddress != null && ipAddress.contains(",")) {
-            ipAddress = ipAddress.split(",")[0];
+        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
         }
-        return ipAddress;
+        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+
+        // 2. 处理多级代理
+        if (ip != null && ip.contains(",")) {
+            ip = Arrays.stream(ip.split(","))
+                    .map(String::trim)
+                    .filter(part -> !"unknown".equalsIgnoreCase(part))
+                    .findFirst()
+                    .orElse(null);
+        }
+
+        // 3. 最终回退
+        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+
+        // 4. 本地测试兼容
+        if ("0:0:0:0:0:0:0:1".equals(ip) || "127.0.0.1".equals(ip)) {
+            // 如果是本地测试,尝试从其他渠道获取(如网络接口)
+            try {
+                ip = InetAddress.getLocalHost().getHostAddress();
+            } catch (Exception e) {
+                ip = "127.0.0.1";
+            }
+        }
+
+        return ip;
     }
 
     // Unix时间戳(秒) -> LocalDateTime