在 JSP 里,获取客户端的 IP 地址的方法是:request.getRemoteAddr(),这种 方法在大部分情况下
都是有效的.但是在通过了 Apache,Squid 等反向代理软件 就不能获取到客户端的真实 IP 地
址了.
Tag:在 JSP 里,获取客户端的 IP 地址的方法是:request.getRemoteAddr(),这 种方法在大部分情
况下都是有效的.但是在通过了 Apache,Squid 等反向代理软 件就不能获取到客户端的真实
IP 地址了.
如 果 使 用 了 反 向 代 理 软 件 , 将 http://192.168.1.110:2046/ 的 URL 反 向 代 理 为
http://www.javapeixun.com.cn / 的 URL 时,用 request.getRemoteAddr() 方法获取的 IP 地址
是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实 IP.
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直 接拿到客户端的
IP,服务器端应用也无法直接通过转发请求的地址返回给客户 端.但是在转发请求的 HTTP 头
信息中,增加了 X-FORWARDED-FOR 信息.用以 跟踪原有的客户端 IP 地址和原来客户端请
求的服务器地址.当我们访问 http://www.javapeixun.com.cn /index.jsp/ 时,其实并不是我们浏
览 器 真 正 访 问 到 了 服 务 器 上 的 index.jsp 文 件 , 而 是 先 由 代 理 服 务 器 去 访 问
http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回 给我们的浏览器,因为
是代理服务器去访问 index.jsp 的,所以 index.jsp 中通 过 request.getRemoteAddr()的方法获取
的 IP 实际上是代理服务器的地址, 并不是客户端的 IP 地址.
于是可得出获得客户端真实 IP 地址的方法一:
Public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) { return request.getRemoteAddr(); }
return request.getHeader("x-forwarded-for"); }
可是当我访问 http://www.5a520.cn /index.jsp/ 时,返回的 IP 地址始终 是 unknown,也并不是如
上所示的 127.0.0.1 或 192.168.1.110 了,而我访 问 http://192.168.1.110:2046/index.jsp 时,则能
返回客户端的真实 IP 地 址,写了个方法去验证.原因出在了 Squid 上.squid.conf 的配制文件
时间:2009-03-02 forwarded_for 项默认是为 on,如果 forwarded_for 设成了 off X-Forwarded-
For: unknown
于是可得出获得客户端真实 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 的值并不止一个, 而是一串 Ip 值,
究竟哪个才是真正的用户端的真实 IP 呢? 答案是取 X-Forwarded-For 中第一个非 unknown
的 有 效 IP 字 符 串 . 如 : X-Forwarded-For: 192.168.1.110, 192.168.1.120, 192.168.1.130,
192.168.1.100 用户真实 IP 为: 192.168.1.110
评论1