近期的一个项目任务,在页面列表中展示获取客户端的IP的地址,可能这是一个很常见的功能,但有些时候,常见的东西才真的值得去思考。
在java web 编程中,熟悉servlet的人都就知道,servlet API 中request 对象提供了方法可以获取客户端浏览器的IP,为什么说是客户端浏览器的IP呢,因为在这里,当我们打开浏览器去访问一个网站时,很多时候是启用了代理服务器去访问应用服务器程序的。
使用requestrequest.getRemoteAddr(),获取客户端IP地址
或者使用 request.getRemoteHost() ,获取客户端主机名
这两种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
我的方法如下:
获得客户端真实IP地址的方法一:
public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
获得客户端真实IP地址的方法二:
public String getIpAddr(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;
}
注意:如何"x-forwarded-for"保存了多个值,则第一个非unknown的为有效IP字符串,即它是客户端浏览器访问的真实IP地址。