获取ip

来源:互联网 发布:联通云数据与联通关系 编辑:程序博客网 时间:2024/05/21 08:45
要获得用户真实的IP地址需要借助请求报头中的x-forwarded-for变量。 
request.getHeader("x-forwarded-for"); 


完整实例如下 

<%@ page contentType="text/html; charset=gb2312" %> 
<%@ page import="java.util.*"%> 
<% 
String realIP = request.getHeader("x-forwarded-for"); 
String ip = request.getRemoteAddr(); 
Enumeration enum = request.getHeaderNames(); 
while(enum.hasMoreElements()) 
{ 
   String name = (String)enum.nextElement(); 
   String value = request.getHeader(name); 
   out.write(name + "=" + value + "<br>"); 
} 
%> 
你的IP地址是:<%=realIP%> 


在 很多应用下都可能有需要将用户的真实IP记录下来,这时就要获得用户的真实IP地址,在JSP里,获取客户端的IP地址的方法 是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获 取到客户端的真实IP地址了。 

  这段时间在做IP统计的程序设计,由于服务器作了集群,使用了反向代理软 件,将http://192.168.1.110:2046/ [1]的URL反向代理为http://www.xxx.com/ [2]的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并 不是客户端的真实IP。这是什么原因呢? 

   这是反向代理的原因。经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的 地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务 器地址。当我们访问http://www.xxx.com/index.jsp/ [3]时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问 http://192.168.1.110:2046/index.jsp [4],代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过 request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。 
于是可得出获得客户端真实IP地址的方法一: 
public String getIpAddr(HttpServletRequest request) { 
       String ip = request.getHeader("x-forwarded-for"); 
      if(ip == null || ip.length() == 0) { 
             ip = request.getRemoteAddr(); 
         } 
        return ip; 
     } 

可 是当我访问http://www.xxx.com/index.jsp/ [5]时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我访问 http://192.168.1.110:2046/index.jsp [6]时,则能返回客户端的真实IP地址,写了个方法去验证。 
<%@ page import="java.util.*" %> 
<table border=1 cellspacing=0 cellpadding=0 align=center> 
<tr> 
<th>Name</th> 
<th>Value</th> 
</tr> 
<% 
Enumeration enumNames; 
String strName,strValue; 
 
enumNames = request.getHeaderNames(); 
while(enumNames.hasMoreElements()){ 
     strName = (String)enumNames.nextElement(); 
     strValue = request.getHeader(strName); 
    %> 
    <tr> 
    <td><%=strName%></td> 
    <td><%=strValue%></td> 
    </tr> 
    <% 
} 
%> 
<tr> 
</table> 
出来的结果:X-Forwarded-For: unknown 。X-Forwarded-For确实存在,但其值却为unknown,继续找原因。上网搜了搜,原因出在了Squid上。 

squid.conf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off  则: 

X-Forwarded-For: unknown 

一查,发现forwarded_for 项设为了off,原因找到了,把forwarded_for 项设为了on,重启后,访问http://www.xxx.com/index.jsp/ [7] 获得的IP是客户端的真实IP。 

  于是可得出获得客户端真实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
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝商家一直不发货怎么办 淘宝商家不发货也不退款怎么办 淘宝买家恶意差评怎么办 淘宝评价完了忘截图了怎么办 12306app登录不上怎么办 淘宝换绑支付宝失败怎么办 淘宝和手机不兼容怎么办 换号之后微信怎么办 手机不兼容的应用程序怎么办 微信版本低登录不了怎么办 软件与系统不兼容怎么办 软件与手机系统不兼容怎么办 qq和手机不兼容怎么办 来个软件不兼容怎么办 安卓8.0不兼容app怎么办 两条内存不兼容怎么办 王者荣耀软件不兼容怎么办 冒险岛不兼容win7怎么办 百度网盘手机号换了怎么办 破解版游戏闪退怎么办 安卓手机软件不兼容怎么办 安卓8.0软件闪退怎么办 游戏与手机系统不兼容怎么办 耳机和手机不兼容怎么办 软件和手机不兼容怎么办 小米6开关键失灵怎么办 同步助手下载不了微信旧版本怎么办 闲鱼退货卖家拒收怎么办 闲鱼把联系人删了怎么办 闲鱼付款了卖家不发货怎么办 红米4c卡怎么办 如果买鞋子买到假的怎么办 猎趣永久封号钱怎么办 支付宝换绑定手机后怎么办 为什么回收站的删除键不见了怎么办 微信在异地登录怎么办 支付宝帐号被冻结怎么办 进不了路由器设置页面怎么办 支付宝支付密码忘记了怎么办 淘宝忘记登录密码了怎么办 手机换卡了微信怎么办