liujie
2025-06-06 dedefa06e62e001b69fa52bb18c759f5fe951c08
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.panzhihua.sangeshenbian.utils;
 
import javax.servlet.http.HttpServletRequest;
 
public class IpUtils {
    public static String getClientIp(HttpServletRequest request) {
        String ip = null;
        // 1. 优先检查代理头信息(需注意头可能被伪造)
        String[] headers = {"X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP"};
 
        for (String header : headers) {
            ip = request.getHeader(header);
            if (isValidIp(ip)) {
                // 处理多层代理情况(X-Forwarded-For可能有多个逗号分隔的IP)
                return ip.contains(",") ? ip.split(",")[0].trim() : ip;
            }
        }
 
        // 2. 无代理头时使用默认方法
        ip = request.getRemoteAddr();
 
        // 处理IPv6本地地址格式
        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
    }
 
    private static boolean isValidIp(String ip) {
        return ip != null && ip.length() != 0
                && !"unknown".equalsIgnoreCase(ip);
    }
}