文档章节

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

YaZi-Liu
 YaZi-Liu
发布于 2016/07/15 14:29
字数 804
阅读 227
收藏 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...

共有 人打赏支持
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
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
nginx+resin 后台如何获取客户端真实ip

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

testzhang
2015/04/08
760
1

没有更多内容

加载失败,请刷新页面

加载更多

Mac OS X下Maven的安装与配置

Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录。例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven classpath $ vi ~/.bash_profile 添加下列两行代码,之后...

TonyStarkSir
今天
3
0
关于编程,你的练习是不是有效的?

最近由于工作及Solution项目的影响,我在重新学习DDD和领域建模的一些知识。然后,我突然就想到了这个问题,以及我是怎么做的? 对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即...

问题终结者
今天
3
0
打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
4
0
搞定Northwind示例数据库,无论哪个版本的SQLServer都受用

Northwind数据库 从这里可以找到突破口: http://social.msdn.microsoft.com/Forums/zh-CN/Vsexpressvb/thread/8490a1c6-9018-40c9-aafb-df9f79d29cde 下面是MSDN: http://msdn2.microsoft......

QQZZFT
昨天
1
0
mysql主从同步,安装配置操作

准备 两台mysql服务,我这里准备了如下: 主库:192.168.176.128 从库:192.168.176.131 如何在Linux上安装mysql服务,请看https://blog.csdn.net/qq_18860653/article/details/80250499 操作...

小致dad
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部