首页 > 编程语言 >怎样用Java来获取真实的IP地址

怎样用Java来获取真实的IP地址

时间:2023-06-09 10:38:53浏览次数:52  
标签:index Java ip request 192.168 获取 IP地址 客户端


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

如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.bt285.cn / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.5q520.cn /index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

于是可得出获得客户端真实IP地址的方法一:

  1. =
1. public String getRemortIP(HttpServletRequest request) {    
2.   if (request.getHeader("x-forwarded-for") == null) {    
3.    return request.getRemoteAddr();    
4.   }    
5.   return request.getHeader("x-forwarded-for");    
6.  }


可是当我访问http://www.5a520.cn /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

标签:index,Java,ip,request,192.168,获取,IP地址,客户端
From: https://blog.51cto.com/u_16065168/6445673

相关文章

  • java 实现对象排序,实现java对象排序的三种方式
    1.自然排序:要排序的对象类实现Comparable<>接口,重写其compareTo()方法,方法体中实现对象的比较大小规则2.自定义排序,需编写匿名内部类,先new一个Comparator接口的比较器对象c,同时实现compare()其方法;然后将比较器对象c传给Collections.sort()方法的参数列表中,实现排序功能,......
  • Web前端和Java哪个好?
    学Web前端好还是学Java好?这是一个常见的问题,两者都是非常有前途的领域,并且都有自己的长处和优势。在选择之前,需要先了解两个方向的发展前景和技能要求。下面我们从以下几个方面进行比较。 1、薪资待遇就薪资待遇而言,Java开发人员的薪资通常较高,特别是在大型公司和金融领域。根据Pa......
  • Java理论和实践:用软引用阻止内存泄漏
    在本文中,他将解释Reference对象的另外一种形式,即软引用(softreferences),用于帮助垃圾收集器管理内存使用和消除潜在的内存泄漏。垃圾收集可以使Java程序不会出现内存泄漏,至少对于比较狭窄的“内存泄漏”定义来说如此,但是这并不意味着我们可以完全忽......
  • document.evaluate的详细用法(Xpath获取节点)
    document.evaluate的详细用法2006-12-2818:03使用 Greasemonkey 时会遇到的功能最为强大的一个工具就是 evaluate 函数。通过使用XPath这种查询语言,它可以用来寻找页面中的元素,属性和文本。 举个例子来说,如果您想获得某个页面上的全部链接。您也许会想到使用document.getEle......
  • javaScript通用数据类型校验_1
    /***取得字符串的字节长度*/1.functionstrlen(str)2.{3.vari;4.varlen;5.6.len=0;7.for(i=0;i<str.length;i++)8.{9.if(str.charCodeAt(i)>255)len+=2;elselen++;10.}11......
  • JAVA面试题解惑系列(六)——字符串(String)杂谈
    关键字:java面试题字符串string作者:臧圩人(zangweiren)网址:http://zangweiren.javaeye.com上一次我们已经一起回顾了面试题中常考的到底创建了几个String对象的相关知识,这一次我们以几个常见面试题为引子,来回顾一下String对象相关的其它一些方面。String的l......
  • java关键字native、static、final详解
    native: native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。JNI是Java本机接口(JavaNativeInterface),是一个本......
  • 【HMS Core】华为帐号服务,获取Access Token报错{sub_error:20152,error_description:inv
    ​ 【问题描述】华为账号服务,接口获取AccessToken报错:{sub_error:20152,error_description:invalidcode,error:1101} 【问题分析】根据官网提示,是code格式不正确造成的,需要检查参数配置​ 【解决方案】1、此问题解决方案,可以参考这篇帖子https://developer.huawei.com/......
  • 【HMS Core】华为帐号服务,获取Access Token报错{sub_error:20152,error_description:inv
     【问题描述】华为账号服务,接口获取AccessToken报错:{sub_error:20152,error_description:invalidcode,error:1101}【问题分析】根据官网提示,是code格式不正确造成的,需要检查参数配置【解决方案】1、此问题解决方案,可以参考这篇帖子https://developer.huawei.com/consumer/cn/forum/......
  • effective java读后感1(1-5点)
    effectivejava中提供了57条建议。针对这些建议,我谈谈自己的理解。1.考虑用静态工厂方法代替构造函数静态工厂方式相比于构造函数的两个优点:1)可以有符合自己身份的方法名,方便客户端代码的阅读2)调用的时候,不要求创建一个新的实例。可以返回缓存实例,或者singleton实例等静态工厂方法......