`

用java获取真实的ip地址

    博客分类:
  • Web
阅读更多
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.bt285.cn / 的URL时,用request.getRemoteAddr() 方法获取的IP地址是:127.0.0.1 或 192.168.1.110 ,而并不是客户端的真实IP。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的 IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪 原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.5q520.cn /index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr() 的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。
于是可得出获得客户端真实IP地址的方法一:
  1. public String getRemortIP(HttpServletRequest request) {   
  2.    if (request.getHeader( "x-forwarded-for" ) == null ) {   
  3.     return request.getRemoteAddr();   
  4.    }   
  5.    return request.getHeader( "x-forwarded-for" );   
  6. }  
Java代码 复制代码
  1. public String getRemortIP(HttpServletRequest request) {  
  2. if (request.getHeader( "x-forwarded-for" ) == null ) {  
  3. return request.getRemoteAddr();  
  4. }  
  5. return request.getHeader( "x-forwarded-for" );  
  6. }  
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 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off  则:X-Forwarded-For: unknown

于是可得出获得客户端真实IP地址的方法二:

  1. public String getIpAddr(HttpServletRequest request) {   
  2.         String ip = request.getHeader( "x-forwarded-for" );   
  3.         if (ip == null || ip.length() == 0 || "unknown" .equalsIgnoreCase(ip)) {   
  4.             ip = request.getHeader( "Proxy-Client-IP" );   
  5.         }   
  6.         if (ip == null || ip.length() == 0 || "unknown" .equalsIgnoreCase(ip)) {   
  7.             ip = request.getHeader( "WL-Proxy-Client-IP" );   
  8.         }   
  9.         if (ip == null || ip.length() == 0 || "unknown" .equalsIgnoreCase(ip)) {   
  10.             ip = request.getRemoteAddr();   
  11.         }   
  12.         return ip;   
  13.     }  
Java代码 复制代码
  1. public String getIpAddr(HttpServletRequest request) {  
  2. String ip = request.getHeader("x-forwarded-for" );  
  3. if (ip == null || ip.length() == 0 || "unknown" .equalsIgnoreCase(ip)) {  
  4. ip = request.getHeader("Proxy-Client-IP" );  
  5. }  
  6. if (ip == null || ip.length() == 0 || "unknown" .equalsIgnoreCase(ip)) {  
  7. ip = request.getHeader("WL-Proxy-Client-IP" );  
  8. }  
  9. if (ip == null || ip.length() == 0 || "unknown" .equalsIgnoreCase(ip)) {  
  10. ip = request.getRemoteAddr();  
  11. }  
  12. return ip;  
  13. }  
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

分享到:
评论

相关推荐

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

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

    Java获取客户端真实IP地址

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

    java 获取客户端ip mac地址

    如果需要获取真实的客户端IP地址,还需要检查HTTP头部信息中的`X-Forwarded-For`字段。 #### 二、获取客户端 MAC 地址 获取客户端的MAC地址相对较为复杂,一般不推荐直接在Web应用中实现该功能。但在某些特定场景...

    java获取客户端ip及mac地址

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

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

    在Web开发中,经常需要获取客户端的真实IP地址来进行一系列的操作,比如统计访问来源、进行地理定位、安全防护等。然而,在实际应用场景中,客户端请求往往经过了多级代理(如Apache、Squid等),这使得直接使用`...

    Java获取ip所在地区

    总的来说,通过Java获取IP所在地区涉及到网络编程、二进制文件解析以及数据库操作等多个技术点。正确理解和实现这一过程,可以帮助我们在各种应用场景下,如网站访问统计、网络安全分析等,更好地处理与IP地址相关的...

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

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

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

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

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

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

    java获取linux服务器上的IP操作

    在本文中,我们将详细介绍Java获取Linux服务器上的IP操作,包括Linux服务器上的网络接口、回环接口、获取IP地址的方法等。 Linux服务器上的网络接口 在Linux服务器上,网络接口是用来发送和接受数据包的基本设备...

    idea,java获取ip地址

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

    Java中获取IP地址,主机名称,网卡地址

    Java 中获取 IP 地址、主机名称、网卡地址需要使用 InetAddress 类和 Runtime 类。我们可以使用 InetAddress 类的 getLocalHost() 方法来获取本地主机的 IP 地址,并使用 getHostName() 方法来获取主机名称。获取...

    java socket 用户真实IP测试

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

    java获取用户真实ip

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

    java获取本机IP地址

    总结来说,Java中获取本机IP地址涉及到`InetAddress`和`NetworkInterface`类的使用,以及对网络接口的理解。对于公网IP的获取,通常需要借助外部服务。在实际开发中,根据具体需求选择合适的方法。在提供的`GetIp....

    java获取ip地址示例

    总的来说,获取Java Web应用中的客户端IP地址需要考虑网络架构中的反向代理因素,通过检查`X-Forwarded-For`等HTTP头部来获取真实的客户端IP,同时注意防止潜在的安全风险。在处理多级反向代理时,应正确解析`X-...

    获取用户真实IP地址

    本篇文章将详细介绍如何在不同情况下获取用户的真实IP地址,并探讨可能遇到的问题。 首先,最常见的方法是在HTTP请求头中查找“X-Real-IP”或“X-Forwarded-For”字段。这些字段通常由代理服务器设置,用于传递原始...

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

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

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

    // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址 String headerName = "x-forwarded-for"; String ip = request.getHeader(headerName); if (null != ip && ip.length() != 0 && !"unknown...

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

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

Global site tag (gtag.js) - Google Analytics