com.github.xiaoyuge5201.ip.IPUtils Maven / Gradle / Ivy
package com.github.xiaoyuge5201.ip;
import javax.servlet.http.HttpServletRequest;
/**
* 获取ip地址
* @author yugb
*/
public class IPUtils {
private static final String UNKNOWN = "unknown";
private static final String DEFAULT_SEPARATOR = ",";
private static final int DEFAULT_IP_LENGTH = 15;
/**
* 获取ip地址
* @param request 请求
* @return 結果
*/
public static String getIPAddress(HttpServletRequest request){
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
// 代理IP
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
// 网宿cdn的真实ip
ip = request.getHeader("Cdn-Src-Ip");
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
// 蓝讯cdn的真实ip
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
// 真实IP
ip = request.getRemoteAddr();
}
// 如果是多级代理,那么取第一个ip为客户端ip
if (ip != null && ip.length() > DEFAULT_IP_LENGTH && ip.contains(DEFAULT_SEPARATOR)) {
String[] ips = ip.split(DEFAULT_SEPARATOR);
for (String strIp : ips) {
if (!UNKNOWN.equalsIgnoreCase(strIp)) {
ip = strIp;
break;
}
}
}
return ip;
}
//Nginx代理传递的实际客户端 IP-header
public static final String[] HEADERS_TO_TRY = {
"X-Forwarded-For",
"X-REAL-IP",
"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",
"REMOTE_ADDR",
"REMOTE-HOST"
};
/**
* 获取客户端的IP地址
* @param request 请求
* @return 结果
*/
public static String getClientIp(HttpServletRequest request) {
String clientIp = _getClientIp(request);
if (null != clientIp && !clientIp.trim().isEmpty()) {
return clientIp;
}
return request.getRemoteAddr();
}
/**
* @param request 请求
* @return 结果
*/
private static String _getClientIp(HttpServletRequest request) {
for (String header : HEADERS_TO_TRY) {
String ip = request.getHeader(header);
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
}
return request.getRemoteAddr();
}
}