_小米粥

Java获取客户端真实IP

一般情况下,我们可以使用 request 的 getRemoteAddr()  方法获取客户端实际 IP ,但是使用反向代理后,我们使用 getRemoteAddr() 是无法获取真实的  IP 的。

经过代理之后,客户端和服务端之间加了一个中间层,在转发请求的HTTP头部增加了 x-forwarded-for 信息,以跟踪原来的客户端IP地址和原来客户端请求的服务器地址。

当我们去访问页面时,先由代理服务器去访问服务器的地址和文件,代理服务器再讲访问结果返回给我们的浏览器,所以直接和服务器打交道的是代理服务器,所以我们使用 request.getRemoteAddr()  方法获取到的也只是带服务器的地址。这种情况下我们可以用 request.getHeader("x-forwarded-for") 的方法去获取真实的IP地址。但是在squid.conf 的配制文件中,forwarded_for 项默认是为on 可以获取到,如果 forwarded_for 设成了 off  x-forwarded-for就会返回 unknown,所以我们可以这样写

public String getRemortIP(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();
}
return ip;
}

posted on 2018-08-03 15:38  _小米粥  阅读(339)  评论(0编辑  收藏  举报

导航