`
argel_lj
  • 浏览: 362901 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中getRemoteAddr()方法获取客户端IP地址问题解决方案

阅读更多

在JSP里,获取客户端的IP地址的方法是: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地址和原来客户端请求的服务器地址。当我们访问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地址的方法一:
public String getRemortIP(HttpServletRequest request) {
   if (request.getHeader("x-forwarded-for") == null) {
    return request.getRemoteAddr();
   }
   return request.getHeader("x-forwarded-for");

}

可是当我访问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地址,写了个方法去验证。原因出在了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      }

  可是,如果通过了多级反向代理的话,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


说明:按这种方法不一定100%准,网上很多人提到要准确的话必须做一个客户端空间,如applet。

二、解决request.getRemoteAddr()获取的值为0:0:0:0:0:0:0:1的问题
这种情况只有在服务器和客户端都在同一台电脑上才会出现(例如用localhost访问的时候才会出现),原来是/etc/hosts这个东西作怪(在windows上应该是C:\Windows\system32\drivers\etc\ hosts这个文件),只需要注释掉文件中的 # ::1 localhost 这一行即可解决问题。

分享到:
评论

相关推荐

    jsp获取客户端IP地址的方法.docx

    本文将详细介绍几种在JSP环境中获取客户端IP地址的有效方法,并提供实际的代码示例。 #### 二、获取客户端IP地址的重要性 1. **安全性**:通过识别用户的真实IP地址,可以帮助防止恶意攻击。 2. **统计分析**:收集...

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

    在这种情况下,原始的客户端IP地址信息被记录在HTTP请求头中的`X-Forwarded-For`字段里。 #### 三、解决方案 为了准确获取客户端的真实IP地址,我们可以采用以下几种方法: ##### 方法一:基本实现 首先,检查...

    java socket 用户真实IP测试

    在描述中提到的博客文章,很可能是详细介绍了这个问题的解决方案。通常,当用户通过Nginx访问服务时,Nginx会作为客户端与服务器建立Socket连接,这时服务器接收到的Socket连接请求的源IP将是Nginx的IP,而不是用户...

    获取客户端ip

    `request.getRemoteAddr()`是一个常用的Java方法,用于获取客户端的IP地址。这个方法在没有使用代理服务器的情况下非常有效。但在使用了Apache、Squid等反向代理软件的情况下,此方法将不再适用,因为它只能获取到...

    jsp获取浏览者真实IP地址方法

    通常,开发人员会首先尝试使用`HttpServletRequest`接口中的`getRemoteAddr()`方法来获取客户端的IP地址。这个方法在没有代理服务器的直连环境中表现良好,但当客户端请求经过了Apache、Squid等反向代理软件时,返回...

    Jsp开发遇到的70个问题及解决方法记录

    获取客户端IP地址 - **问题描述**:如何在JSP页面中获取访问者的IP地址。 - **解决方案**:通过HttpServletRequest对象的`getRemoteAddr()`方法可以获取客户端的IP地址。 ### 6. 清除浏览器缓存 - **问题描述**...

    java(20211007021206).pdf

    4. **获取客户端IP地址**: 在JSP中,可以通过`HttpServletRequest`对象的`getRemoteAddr()`方法来获取客户端的IP地址。 5. **程序结束与输出结束**: 要结束程序,可以使用`return`语句。要关闭输出流,如`...

    关于ip的过滤器 spring security例子

    本文将深入探讨如何在Spring Security中实现IP过滤器,以便控制访问应用的客户端IP地址。 首先,我们需要理解Spring Security的基本架构。它是一个多层次的组件模型,其中包括认证、授权和会话管理等核心功能。在...

    70个JAVA问答.txt

    获取客户端IP地址 在JSP或Servlet中,可以使用`request.getRemoteAddr()`方法来获取客户端的IP地址。这是通过Web服务器API提供的功能,如Tomcat等。 ### 5. 关闭输出流 在处理流时,关闭流是非常重要的步骤。...

    九大内置对象.doc

    6. **getRemoteAddr()**:获取客户的IP地址。 ```java String strIP = request.getRemoteAddr(); ``` 7. **getRemoteHost()**:获取客户机的名称。 ```java String clientName = request.getRemoteHost(); ```...

    超级有影响力霸气的Java面试题大全文档

    内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...

    Hessian源码分析和Hack.doc

    然而,在实际应用中,有时我们需要获取到远程调用端的IP地址、主机名等信息,以便进行日志记录、权限控制或特定业务处理。在Hessian的官方文档和网络资源中,很难找到直接获取这些信息的方法。本文将通过深入剖析...

Global site tag (gtag.js) - Google Analytics