java获取ip地址示例

时间:2021-12-25 07:04:22 

如果使用了反向代理软件,将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地址和原来客户端请求的服务器地址。当我们访问http://www.xxx.com/index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

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


public String getRemortIP(HttpServletRequest request) {
  if (request.getHeader("x-forwarded-for") == null) {
   return request.getRemoteAddr();
  }
  return request.getHeader("x-forwarded-for");
 }

可是当我访问http://www.xxx.com/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地址的方法二:


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

可是,如果通过了多级反向代理的话,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
0
投稿

猜你喜欢

  • SpringBoot使用jasypt加解密密码的实现方法(二)

    2021-10-15 14:16:46
  • springboot整合mybatis实现简单的一对多级联查询功能

    2023-11-07 13:30:22
  • Java基于Runtime调用外部程序出现阻塞的解决方法

    2023-11-09 04:24:23
  • 自定义spring mvc的json视图实现思路解析

    2023-03-12 12:04:44
  • Java设计模式之单例和原型

    2023-11-29 04:14:18
  • 详解kafka中的消息分区分配算法

    2021-06-02 08:16:15
  • SpringMVC执行步骤、Model的使用详解

    2022-02-13 05:38:45
  • java连接sql server 2008数据库代码

    2023-05-27 10:40:01
  • Redis之GEO存储地理位置信息的使用

    2023-12-22 14:29:49
  • java中map与实体类的相互转换操作

    2023-03-14 01:42:35
  • SpringBoot项目部署到腾讯云的实现步骤

    2023-01-01 16:58:55
  • C# LINQ查询表达式及对应LAMBDA表达式的用法

    2023-07-31 19:15:26
  • Jar包冲突问题原理及解决方案

    2023-03-05 09:40:02
  • springcloud feign传输List的坑及解决

    2023-06-20 18:31:57
  • C# zxing二维码写入的实例代码

    2021-09-01 12:23:26
  • 了解Java线程池创建过程

    2022-09-29 20:45:49
  • 新手初学Java常见排序算法

    2022-05-09 03:35:45
  • 解决springboot 部署到 weblogic 中 jar 包冲突的问题

    2021-06-06 11:32:36
  • java 中锁的性能提高办法

    2021-07-28 10:50:28
  • JDK动态代理原理:只能代理接口,不能代理类问题

    2023-06-16 03:18:40
  • asp之家 软件编程 m.aspxhome.com