1、使用下面的代碼獲取實際IP的時候 會出現 IP清單【49.77.233.222, 140.205.253.100】
/**
* 獲取ip地址,防止集羣、代理
*
* @param request
* @return ip
*/
public static String getAddr(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 = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getRemoteAddr();
}
}
2、其實這個由於多層代理所致,第一個是用戶的對外公網IP,第二個是某一層的代理IP,比如阿里雲的CDN 的CNAME服務器,或者獨立的Apache Nginx代理服務器
3、只返回用戶的正式IP,獲取第一個
/**
* 獲取ip地址,防止集羣、代理
*
* @param request
* @return ip
*/
public static String getAddr(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 = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getRemoteAddr();
}
// 解決出現多層代理,返回第一個作爲實際IP地址
if (MoShopUtil.isNotEmpty(ip))
{
String[] ips = ip.split(",");
if (ips.length > 0)
{
return ips[0].trim();
}
}
return ip;
}