免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1000 | 回复: 0
打印 上一主题 下一主题

获取客户端的真实IP地址 之java [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-13 10:59 |只看该作者 |倒序浏览

获取客户端的真实IP地址
关键字: Java
在很多应用下都可能有需要将用户的真实IP记录下来,这时就要获得用户的真实IP地址,在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
  这段时间在做IP统计的程序设计,由于服务器作了集群,使用了反向代理软件,将http://192.168.1.110:2046/的URL反向代理为http://www.xxx.com/的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/时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。
  于是可得出获得客户端真实IP地址的方法一:
Java代码

  • public String getIpAddr(HttpServletRequest request) {   
  •       String ip = request.getHeader("x-forwarded-for");   
  •       if(ip == null || ip.length() == 0) {   
  •             ip = request.getRemoteAddr();   
  •         }   
  •         return 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/时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我访问http://192.168.1.110:2046/index.jsp时,则能返回客户端的真实IP地址,写了个方法去验证。
    Java代码

  • import="java.util.*" %>   
  • 1 cellspacing=0 cellpadding=0 align=center>   
  •    
  • Name   
  • Value   
  •    

  • Enumeration enumNames;   
  • String strName,strValue;   
  •   
  • enumNames = request.getHeaderNames();   
  • while(enumNames.hasMoreElements()){   
  •     strName = (String)enumNames.nextElement();   
  •     strValue = request.getHeader(strName);   
  •     %>   
  •         
  •         
  •         
  •         
  •    
  • }   
  • %>   
  •    
  •   


    Name
    Value


         
         
         
         
       
      出来的结果: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/ 获得的IP是客户端的真实IP。
      于是可得出获得客户端真实IP地址的方法二:
    Java代码

  • 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;   
  • }      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

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/76972/showart_1861498.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP