`

java获得代理真实IP

    博客分类:
  • Java
阅读更多
转载:java获得代理真实IP
http://lijie250.iteye.com/blog/251616
最新参考资料链接
获取ip地址方法与示例
http://chenshuai365-163-com.iteye.com/blog/720430

项目中需要和第三方平台接口,加了来源IP鉴权功能,测试时发现没有问题,但是部署以后发现存在问题,一直鉴权不通过,一群人抓瞎。

我找到那块的代码,跟了一遍流程发现逻辑没有啥问题,但是最终的结果却还是鉴权不通过,实在有些诡异。其基本逻辑为先取得配置的IP列表,然后通过request.getRemoteAddr()取得客户端的IP地址,做鉴权和校验,逻辑没问题,那么肯定是request.getRemoteAddr()出了问题,google下,发现有人遇到类似的问题。

最终定位为request.getRemoteAddr()这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实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地址和原来客户端请求的服务器地址。
原来如此,我们的项目中正好是有前置apache,将一些请求转发给后端的weblogic,看来就是这样导致的咯。

给出一份还算靠谱的代码,如下:

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


如果有人遇到类似问题,请多加留意,呵呵。

PS:可是,如果通过了多级反向代理的话,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
分享到:
评论

相关推荐

    java非常强的获取客户端真实IP的两种方法

    Java获取客户端真实的IP的两种实现方法,即使通过多级代理也能获取到,很有用

    获取客户端真实IP(支持代理服务器)

    获取客户端真实IP(支持代理服务器)

    Java获取客户端IP及Mac地址(同网段).rar

    但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。所以...

    用Java来获取访问者真实的IP地址

    但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。

    java获得客户端真实的ip地址

    但是在通过了apache,squid等反向代理软件就不能获取到客户端的真实ip地址了。如果使用了反向代理软件,用request.getremoteaddr()方法获取的ip地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实ip。

    Java中使用HttpRequest获取用户真实IP地址

    主要介绍了Java中使用HttpRequest获取用户真实IP地址,使用本文方法可以避免Apache、Squid、nginx等反向代理软件导致的非真实IP地址,需要的朋友可以参考下

    Java正确获取客户端真实IP方法整理.docx

    但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将http://192.168.1.110:2046/的URL反向代理为http://www.abc.com/的URL时,用request.getRemoteAddr()方法...

    Java实现获取客户端真实IP方法小结

    本文给大家汇总介绍了2种使用java实现获取客户端真实IP的方法,主要用于获取使用了代理访问的来访者的IP,有需要的小伙伴可以参考下。

    获取客户端IP

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

    java中怎么获取客户端的真实的IP

    提供数种java中如何获取客户端真实IP的方法和代码, 含使用代理服务器情况

    Java获取客户端IP

    但是在通过了Apache,Squid等反向代理软件不能获取到客户端的真实IP地址了。  原因:由于在客户端和服务之间增加了中间代理,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给...

    java获取ip地址示例

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

    获取用户真实IP地址,不使用request.getRemoteAddr()的原因是有可能用户使用了代理软件方式避免真实IP地址

    获取请求接口的真实ip 地址工具类。适合所有Java开发人员。针对接口的ip 地址的获取。

    java实现全网显示IP归属地怎么实现-看过来

    通过上面这段代码,我们可以轻松获取的请求用户的ip 里面包含了 根据网卡获取本机配置的IP地址、对于通过多个代理的情况,获取真实IP, 通过IP获取归属地 IP获取到了,name怎么获取IP地址的归属地的省份、城市呢? ...

    Java获取客户端的真实IP地址

    但是在通过了Apache,Squid等反向代理软件不能获取到客户端的真实IP地址了。像移动网关一样,iisforward这个ISAPI过滤器也会对request对象进行再包装,附加一些WLS要用的头信息。这种情况下,直接用request....

    JAVA上百实例源码以及开源项目

    摘要:Java源码,初学实例,基于EJB的真实世界模型  基于EJB的真实世界模型,附源代码,部分功能需JSP配合完成。 J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理  这是个J2ME...

    JAVA上百实例源码以及开源项目源代码

    摘要:Java源码,初学实例,基于EJB的真实世界模型  基于EJB的真实世界模型,附源代码,部分功能需JSP配合完成。 J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理  这是个J2ME...

    java jdk实列宝典 光盘源代码

    内容: 1 转换基本数据类型;运算符;计算阶乘; 2 复数类;java的参数传递;...获取客户端的真实ip地址; jsp无刷新聊天室; 设置和读取cookie; 上传文件; 用servlet生成图形验证码; 用servlet实现分页查看数据库;

    org.apache.commons.lang3.StringUtils.jar

    java获取客户端ip(经过多次代理)提示StringUtils cannot be resolved 需要先 import org.apache.commons.lang3.StringUtils; /* 内含 common-lang3.jar commons-lang3-3.9-bin.zip commons-lang3-3.9-src.zip ...

Global site tag (gtag.js) - Google Analytics