`

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的两种方法详解 #### 一、问题背景 在Web开发中,经常需要获取客户端的真实IP地址来进行一系列的操作,比如统计访问来源、进行地理定位、安全防护等。然而,在实际应用场景中,客户端请求...

    Java获取客户端真实IP地址

    ### Java获取客户端真实IP地址详解 在Web开发中,获取客户端的真实IP地址是一个常见的需求,尤其是在需要进行地理位置定位、安全审计、流量统计等场景下。然而,在存在反向代理服务器的环境中,传统的`request....

    java socket 用户真实IP测试

    当涉及到通过代理服务器或者负载均衡器(如Nginx)进行TCP转发时,获取用户的真实IP地址可能会变得复杂。在标题“java socket nginx tcp转发 用户真实IP测试”中,主要探讨的是如何在Java的Socket连接中,通过Nginx...

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

    ### 使用Java获取访问者真实IP地址 在现代Web开发中,获取客户端的真实IP地址是非常重要的。这不仅有助于网站统计分析,还可以用于安全控制、地域限制等功能。然而,在使用如Apache、Squid等反向代理服务器的情况下...

    java获取用户真实ip

    在探讨如何通过Java获取用户的真实IP地址之前,我们先来了解一下为什么这是一项重要的任务。在Web开发中,了解客户端的IP地址对于统计访问来源、安全验证(如防止恶意攻击)、地理定位等功能至关重要。然而,由于...

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

    ### 获取客户端真实IP(支持代理服务器) #### 一、背景介绍 在Web开发过程中,有时候我们需要获取客户端的真实IP地址,特别是在涉及到用户地理位置定位、安全控制等场景时尤为重要。然而,在实际应用中,很多情况...

    Java获取客户端真实IP地址过程解析

    Java获取客户端真实IP地址过程解析 ...Java获取客户端真实IP地址过程需要考虑多种情况,包括直接访问服务器端和通过多级代理访问服务器端,需要合理地使用HttpServletRequest对象和各种请求头来获取客户端真实IP地址。

    java IP地址工具类,java IP地址获取,java获取客户端IP地址

    在Java编程中,获取IP地址是一项常见的任务,特别是在网络编程和服务器开发中。这个"java IP地址工具类"是为了解决这个问题而设计的。它提供了便捷的方法来获取和处理IP地址,尤其对于获取客户端IP地址在Web应用中至...

    java 获取客户端ip mac地址

    ### Java 获取客户端 IP 和 MAC 地址 在Java Web开发中,有时我们需要获取客户端的IP地址甚至是MAC地址,以便进行安全验证、用户行为追踪等操作。本文将详细介绍如何通过Java来实现这一功能。 #### 一、获取客户端...

    IP工具类,通过传入的request获取ip地址(JAVA)

    同样,如果在反向代理环境中,我们需要检查`X-Forwarded-For`头来获取真实的IP: ```java String forwardedFor = request.getHeaders().getFirst("X-Forwarded-For"); if (forwardedFor != null) { ipAddress = ...

    java获取客户端ip及mac地址

    1. **获取 IP 地址**:使用 `request.getRemoteAddr()` 可能会获取到代理服务器的 IP 地址,而通过检查 `X-Forwarded-For` 请求头可以更准确地获取客户端的真实 IP 地址。 2. **获取 MAC 地址**:虽然可以通过执行...

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

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

    获取用户真实IP地址

    然而,由于代理服务器、负载均衡器、CDN(内容分发网络)等中间设施的存在,直接从HTTP请求中获取的IP地址可能并不是用户的真实IP。本篇文章将详细介绍如何在不同情况下获取用户的真实IP地址,并探讨可能遇到的问题...

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

    ### 使用Java获取访问者真实IP地址 在现代Web开发中,获取客户端的真实IP地址是非常重要的。这不仅可以用于统计分析、安全审计,还可以帮助提供更好的用户体验。然而,在通过代理服务器(如Apache、Squid等)转发...

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

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

    java获取ip地址示例

    因此,为了获取客户端的真实IP,我们需要检查这个字段。 首先,我们可以尝试获取`X-Forwarded-For`头部的值,如以下代码所示: ```java public String getRemortIP(HttpServletRequest request) { if (request....

    idea,java获取ip地址

    当我们构建一个基于Servlet的Web应用程序时,有时需要获取访问用户的真实IP地址,这在处理用户请求、日志记录或者实现地理位置相关的功能时尤为关键。 Servlet是Java服务器端的一种组件,它扩展了Web服务器的功能,...

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

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

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

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

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

    通过上述方法,可以在Java中有效地获取客户端的真实IP地址,即使在存在代理服务器的情况下也不例外。这些方法覆盖了从简单的`request.getRemoteAddr()`到复杂的多级代理服务器环境中的情况。开发者可以根据具体的...

Global site tag (gtag.js) - Google Analytics