有时需要对访问者ip进行记录,但是经过了nginx或者其他代理之后通过HttpServletRequest的getRemoteAddr方法获取到的ip不一定是真实访问者的ip,通过下面的方式可以较准确的获取访问者ip,但也不是万能的,仅作为借鉴!
private boolean isValidIp(String ip){
return !(StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip));
}
private String getIp(HttpServletRequest request){
//一些代理
String ip = request.getHeader("X-Forwarded-For");
if (isValidIp(ip)) {
return ip;
}
//一般是经过apache http服务器的请求才会有,用apache http做代理时一般会加上Proxy-Client-IP请求头
ip = request.getHeader("Proxy-Client-IP");
if (isValidIp(ip)) {
return ip;
}
//WL-Proxy-Client-IP是apache的weblogic插件加上的头
ip = request.getHeader("WL-Proxy-Client-IP");
if (isValidIp(ip)) {
return ip;
}
//有些代理服务器会加上此请求头
ip = request.getHeader("HTTP_CLIENT_IP");
if (isValidIp(ip)) {
return ip;
}
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
if (isValidIp(ip)) {
return ip;
}
//nginx代理一般会加上此请求头
ip = request.getHeader("X-Real-IP");
if (isValidIp(ip)) {
return ip;
}
//这个ip虽然不一定是来自客户端的ip,但是不能被伪造,上面其他方式获取的ip却有可能被伪造!!!
ip = request.getRemoteAddr();
return ip;
}