import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class IpUtils {
// 本地环回地址(IPv6)
private static final String LOCALHOST_IPV6 = "0:0:0:0:0:0:0:1";
// 本地环回地址(IPv4)
private static final String LOCALHOST_IPV4 = "127.0.0.1";
// 未知IP
private static final String UNKNOWN = "unknown";
// 代理相关请求头
private static final List<String> PROXY_HEADERS = Arrays.asList(
"X-Forwarded-For",
"Proxy-Client-IP",
"WL-Proxy-Client-IP",
"HTTP_X_FORWARDED_FOR",
"HTTP_X_FORWARDED",
"HTTP_X_CLUSTER_CLIENT_IP",
"HTTP_CLIENT_IP",
"HTTP_FORWARDED_FOR",
"HTTP_FORWARDED",
"HTTP_VIA"
);
/**
* 获取请求的真实IP地址
*/
public static String getRealIp() {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes == null) {
return UNKNOWN;
}
HttpServletRequest request = attributes.getRequest();
return getRealIp(request);
}
/**
* 通过HttpServletRequest获取真实IP
*/
public static String getRealIp(HttpServletRequest request) {
String ip = null;
// 1. 从代理请求头中获取IP
for (String header : PROXY_HEADERS) {
ip = request.getHeader(header);
if (isValidIp(ip)) {
// X-Forwarded-For可能包含多个IP,取第一个非unknown的IP
if (ip.contains(",")) {
ip = ip.split(",")[0].trim();
}
break;
}
}
// 2. 若代理头中无有效IP,从请求的远程地址获取
if (!isValidIp(ip)) {
ip = request.getRemoteAddr();
}
// 3. 处理本地环回地址(IPv6转IPv4显示)
if (LOCALHOST_IPV6.equals(ip)) {
ip = LOCALHOST_IPV4;
}
return ip;
}
/**
* 验证IP是否有效(非null、非unknown、非空)
*/
private static boolean isValidIp(String ip) {
return ip != null && !ip.isEmpty() && !UNKNOWN.equalsIgnoreCase(ip);
}
}
08-18
269

07-20
567

07-14
346

07-11
222
