`

request.getHeader("x-forwarded-for")获取不到IP

    博客分类:
  • Java
 
阅读更多
获取不到IP有可能是客户端不是http请求:建议你
public String getIpAddr(HttpServletRequest request) {  
 String ip = request.getHeader("x-forwarded-for");  
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  ip = request.getHeader("http_client_ip");  
 }  
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  ip = request.getRemoteAddr();  
 }  
 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.getHeader("HTTP_X_FORWARDED_FOR");  
 }  
 // 如果是多级代理,那么取第一个ip为客户ip   
 if (ip != null && ip.indexOf(",") != -1) {  
  ip = ip.substring(ip.lastIndexOf(",") + 1, ip.length()).trim();  
 }  
 return ip;  
}
 
这个可以获取到的IP是因为反向代理软件,如Apache等软件,
使用这个方法获取的IP地址是:127.0.0.1;
你可以看看这个
http://blog.csdn.net/goodmhjmhj/article/details/7055030

Java获取IP地址:request.getRemoteAddr()警惕
 

项目中需要和第三方平台接口,加了来源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,

看来就是这样导致的咯。

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

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

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

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地址示例

    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...

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

    2. 如果`X-Forwarded-For`不可用或者为`unknown`,则尝试从其他HTTP头部(如`Proxy-Client-IP`和`WL-Proxy-Client-IP`)获取IP地址,最后才使用`request.getRemoteAddr()`。 这两种方法在实际应用中都有其适用场景...

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

    String ip = request.getHeader("X-Forwarded-For"); // 如果X-Forwarded-For为空或者为"unknown",则尝试从Proxy-Client-IP头部获取 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {...

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

    需要注意的是,在处理`X-Forwarded-For`字段时,我们应该优先考虑获取第一个非`unknown`的IP地址,以确保获取到的IP地址尽可能接近客户端的真实地址。同时,对于多级代理的情况,还需要考虑更复杂的逻辑处理,以应对...

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

    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() ...

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

    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...

    jsp页面得到客户端的真是ip

    String realIP = request.getHeader("x-forwarded-for"); String ip = request.getRemoteAddr(); Enumeration<String> enumNames = request.getHeaderNames(); // 打印所有 header 名称及其值 while ...

    Java获取客户端真实IP地址

    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...

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

    String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { // 如果X-Forwarded-For不存在或者为空,则尝试使用其他头部 ip = request....

    获取客户端ip

    这段代码首先尝试从`X-Forwarded-For`字段中获取IP地址,如果没有找到或者获取到的是`unknown`,则使用`request.getRemoteAddr()`方法作为备选方案。 #### 方法二:更复杂的多级代理支持 在多级反向代理的情况下,...

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

    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...

    java获取ip地址

    为了确保获取到正确的客户端 IP 地址,可以通过处理 `X-Forwarded-For` 头部中的多个 IP 地址来实现。例如,如果 `X-Forwarded-For` 的值为 `"192.168.1.1, 192.168.1.2, 192.168.1.3"`,那么原始客户端的 IP 地址是...

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

    String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { return request.getRemoteAddr(); } // 如果存在多个IP,取第一个非unknown的...

    获取访问者真实的IP地址

    2. **处理 `X-Forwarded-For`**:如果`X-Real-IP`不存在或为"unknown",则从`X-Forwarded-For`头中获取IP地址。该头部可能包含多个IP地址,通过逗号分隔。此时取第一个IP地址作为客户端的真实IP地址。 3. **处理 `...

    Java获取登录用户的IP地址示例代码.rar

    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...

    java获取用户真实ip

    为解决这一问题,可以通过检查`x-forwarded-for`字段获取到一个IP地址列表,并从中选取最后一个作为客户端真实IP地址。 ```java if (ip != null && ip.indexOf(",") > 0) { ip = ip.substring(ip.lastIndexOf(",")...

    java获取客户端ip及mac地址

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

    获取客户端IP

    这段代码首先尝试从`X-Forwarded-For`头获取IP,如果找不到,再尝试`Proxy-Client-IP`和`WL-Proxy-Client-IP`。最后,如果所有尝试都失败,它会返回`getRemoteAddr()`的值,这是最直接的客户端IP来源。注意,当存在...

    java socket 用户真实IP测试

    3. **注意安全性**:虽然"X-Forwarded-For"通常被用来获取真实的客户端IP,但它的值可以被客户端篡改,因此在生产环境中,不应完全依赖此头字段,而是结合其他安全措施,如验证服务器的日志或使用更安全的协议。...

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

    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() ...

Global site tag (gtag.js) - Google Analytics