文档章节

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

YaZi-Liu
 YaZi-Liu
发布于 2016/07/15 14:29
字数 804
阅读 247
收藏 1
1、

获取不到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;  
}

追问:

这个  方法 已经试过了   还是不行。request.getHeader("x-forwarded-for");   一直获取的是 null   if 语句里面的  都不会执行。

追答:

既然一直获取的是null,那就会进去if里面啊!你设置断点调试了吗?没有报错,就是获取不到IP吗?贴一点代码我看看

追问:

下面 ip 里面都有值了。 127.0.0.1  

 

 

 

2、

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

本文转载自:http://zhidao.baidu.com/link?url=g8NBwZg-OLkovjEPv66LXyhxmlwFbUDo3yt36w88g5CuDUwVYJOjC-uP4lA9rB2y...

共有 人打赏支持
上一篇: Java常用功能代码
下一篇: Spring+Quartz(一)
YaZi-Liu
粉丝 1
博文 30
码字总数 35566
作品 0
海淀
私信 提问
javaweb获取客户端IP终极加强版

javaweb获取客户端ip的时候,少数时候会获取不到,具体情况也不是很清楚,大概是手机客户端有些安装了代理软件之类的,出现这种状况的时候,使用常见的获取ip方式就有些不够用了,下面收集了...

别寒
2016/06/12
40
0
nginx做负载CDN加速获取端真实ip

在不用cdn的情况下,nginx做负载获取真实ip时,nginx配置如下: proxysetheader Host $host; proxysetheader X-Real-IP $remote_addr; proxysetheader X-Forwarded-For $proxyaddxforwarded......

随影求是
2012/10/04
0
0
nginx+resin 后台如何获取客户端真实ip

公司有个小web项目,nginx做代理转发,nginx和resin部署同一机器上,现在需要获取客户真实ip, nginx.conf配置文件主要内容如下 (这个配置是正常的,nginx能够转发请求) worker_processes...

testzhang
2015/04/08
760
1
java获取真实ip地址

获取真实ip地址的java代码如下: /** * 获取 真实的IP * */ public static String getIp(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null......

hello菜bird
2016/05/25
135
0
获取真实ip地址

获取真实ip地址的java代码如下: /** * 获取 真实的IP * */ public static String getIp(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null......

梁荣良
2016/05/23
152
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL 索引 explain索引分析优化

EXPLAIN是MySQL提供的工具,可用于模拟优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句的,包括表的读取顺序、数据读取操作的操作类型、可能使用的索引、实际使用的索引、表之间的引...

PeakFang-BOK
6分钟前
1
0
17-《深度拆解JVM》之即时编译(上)

一、问题引入 在第一篇中,我们简单了解过即时编译。这是一项用来提升应用程序运行效率的技术。通常而言,代码会先被 Java 虚拟机解释执行,之后反复执行的热点代码则会被即时编译成为机器码...

飞鱼说编程
6分钟前
1
0
OSChina 周二乱弹 —— 请上车吧

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @2amor :分享王菲的单曲《闷》 《闷》- 王菲 手机党少年们想听歌,请使劲儿戳(这里) @開源中國周杰倫 :昨天睡觉肚子疼,妈蛋,半夜爬起来...

小小编辑
56分钟前
522
9
工作中如何做好技术积累

参考:https://tech.meituan.com/study_vs_work.html 看了这篇文章,觉得总结得非常好,因此摘抄了一些关键点,以便自己经常翻阅。 引言 在繁忙的工作中做好技术积累,构建个人核心竞争力. 在...

grace_233
今天
9
0
Mariadb二进制包安装,Apache安装

安装mariadb 下载二进制包并解压 [root@test-a src]# wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.t......

野雪球
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部