`

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

 
阅读更多

通常通过request.getRemoteAddr()

取得客户端的IP地址,做鉴权和校验,逻辑没问题,那么肯定request.getRemoteAddr()出了问题,google下,发现有人遇到类似的问题。

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

如果使用了反向代理软件,将
http://localhost:8080/

的URL反向代理为http://www.xxx.com/

的URL时,用request.getRemoteAddr()
方法获取的IP地址是:127.0.0.1 或 192.168.0.66,而并不是客户端的真实IP。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR

信息用以跟踪原有的客户端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;      
}     

 

像移动网关一样,iisforward这个ISAPI过滤器也会对request对象进行再包装,附加一些WLS要用的头信息。这种情况下,直接用request.getRemoteAddr()是无法取到真正的客户IP的。

实际的iisforward附加头如下:

WL-Proxy-Client-IP=215.4.1.29
Proxy-Client-IP=215.4.1.29
X-Forwarded-For=215.4.1.29
WL-Proxy-Client-Keysize=
WL-Proxy-Client-Secretkeysize=
X-WebLogic-Request-ClusterInfo=true
X-WebLogic-KeepAliveSecs=30
X-WebLogic-Force-JVMID=-527489098
WL-Proxy-SSL=false

public static String getIpAddr(HttpServletRequest request) {
     String ipAddress = null;
     //ipAddress = request.getRemoteAddr();
     ipAddress = request.getHeader("x-forwarded-for");
     if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
      ipAddress = request.getHeader("Proxy-Client-IP");
     }
     if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
         ipAddress = request.getHeader("WL-Proxy-Client-IP");
     }
     if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
      ipAddress = request.getRemoteAddr();
      if(ipAddress.equals("127.0.0.1")){
       //根据网卡取本机配置的IP
       InetAddress inet=null;
    try {
     inet = InetAddress.getLocalHost();
    } catch (UnknownHostException e) {
     e.printStackTrace();
    }
    ipAddress= inet.getHostAddress();
      }
        
     }

     //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
     if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
         if(ipAddress.indexOf(",")>0){
             ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
         }
     }
     return ipAddress;
}


 

分享到:
评论

相关推荐

    java 获取客户端ip mac地址

    获取客户端ip地址( 这个必须从客户端传到后台): jsp页面下,很简单,request.getRemoteAddr() ; 因为系统的VIew层是用JSF来实现的,因此页面上没法直接获得类似request,在bean里做了个强制转换java 获取客户端ip ...

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

    2. **获取客户端IP地址**:在Web应用中,服务器需要区分每个客户端,`IpUtils`可能会有方法处理`HttpServletRequest`对象,从HTTP请求头(如`X-Forwarded-For`或`RemoteAddr`)中解析出真实客户端的IP地址。...

    java socket 用户真实IP测试

    在标题“java socket nginx tcp转发 用户真实IP测试”中,主要探讨的是如何在Java的Socket连接中,通过Nginx的TCP转发获取到实际用户的IP地址。 在描述中提到的博客文章,很可能是详细介绍了这个问题的解决方案。...

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

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能...用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。

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

    在上面的代码中,首先通过x-forwarded-for请求头获取客户端IP地址,然后将其分割以获取第一个IP地址,哪个就是客户端真实IP地址。 此外,还有其他方法可以获取客户端真实IP地址,例如通过Proxy-Client-IP、WL-Proxy...

    IP地址HTTP请求工具类

    获取本地IP地址,获取本地Host名称,获取Linux下的IP地址,获取用户真实IP地址,get/post请求 相应的工具类

    JSP获取客户端IP地址浏览器版本操作系统.pdf

    获取客户端IP地址、浏览器版本和操作系统信息在JSP中的实现方法 在JSP中,获取客户端的IP地址、浏览器版本和操作系统信息是非常重要的。通过使用HttpServletRequest对象,我们可以获取到客户端的相关信息。 获取...

    Java面试之如何获取客户端真实IP

    在Java中,我们可以使用request.getRemoteAddr()方法来获取客户端的IP地址,但是这种方法有一个缺陷,就是当我们使用了nginx反向服务器后,在web端使用request.getRemoteAddr()方法取得的是nginx的地址,而不是用户...

    获取客户端IP地址所需Jar包

    首先,我们需要了解在Java Web应用中获取客户端IP地址的基本方法。通常,在Servlet环境下,可以通过HttpServletRequest对象的getRemoteAddr()方法来获取。然而,在某些情况下,如通过反向代理服务器(如Nginx、...

    java中通过request获取IP以及MAC地址.java

    获取用户请求IP地址 根据IP地址获取mac地址

    Java获取客户端IP

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

    java获取客户端IP及IP归属地

    在Java编程中,获取客户端IP地址以及其归属地是一项常见的需求,这主要涉及到网络协议的理解以及第三方库的使用。在Web应用中,服务器通常需要识别来访用户的地理位置信息,以便进行个性化服务、安全控制或者数据...

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

    因此,它的值可能包含多个IP地址,按照代理顺序从前到后排列,第一个非"unknown"的IP地址通常被视为最原始的客户端IP地址。 以下是两种常见的Java方法来获取客户端真实IP: **方法一:** ```java public String ...

    java获取ipjava获取ipjava获取ipjava获取ipjava获取ip

    System.out.println("客户端IP地址:" + clientAddress.getHostAddress()); } catch (UnknownHostException e) { e.printStackTrace(); } } ``` 在这个例子中,`getRemoteAddr()`方法返回了客户端发起请求的IP...

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

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

    idea,java获取ip地址

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

    java 伪造http请求ip地址的方法

    在 Java 中伪造 HTTP 请求 IP 地址是指通过修改 HTTP 请求头中的 IP 地址信息,从而使得服务器端能够获取到伪造的 IP 地址。这种方法可以应用于各种需要伪造 IP 地址的场景,例如在第三方系统接口对接时,需要将调用...

    获取客户端IP、MAC

    首先,获取客户端IP地址通常涉及到服务器端的编程。在Java中,可以通过`java.net`包中的`Socket`或`HttpServletRequest`类来获取。当客户端发起HTTP请求时,服务器可以接收到请求对象,从中提取出客户端的IP地址。...

    获取用户真实IP地址

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

    IpUtil工具类--通过request获取IP,通过IP获取地址

    IpUtil工具类--通过request获取IP,通过IP获取地址(需要联网,调用淘宝的IP库)。使用场景:在网站开发记录用户增删改查日志的时候,往往需要记录操作人的IP地址,来准确的生成操作日志记录等

Global site tag (gtag.js) - Google Analytics