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

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的 IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问index.jsp/时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问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");
}

获得客户端真实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

更多链接

  • JavaWeb - 获取客户端真实 IP(通过反向代理 Nginx)非服务器 IP(二)

JavaWeb - 获取访问者真实的 IP 地址(一)相关推荐

  1. Java获取访问者真实的IP地址

    个人收录的一些小工具类,供大家参考 方式一 import javax.servlet.http.HttpServletRequest; /** 自定义访问对象工具类获取对象的IP地址等信息 @auth ...

  2. 网站配置了Cloudflare代理后,如何配置Nginx获取的真实客户端IP地址?

    网站配置了Cloudflare代理后,如何配置Nginx获取的真实客户端IP地址? 这是一个很简单的问题,如何在后台获取真实的访问者IP地址? 网站为了避免有些不怀好意的访问者,不得不自动分析一下客户 ...

  3. request获取mac地址_【Go】获取用户真实的ip地址

    原文链接:https://blog.thinkeridea.com/201903/go/get_client_ip.html 用户请求到达提供服务的服务器中间有很多的环节,导致服务获取用户真实的 ip ...

  4. 2021-08-26——获取电脑真实的IP地址,忽略虚拟机等IP地址的干扰

    获取电脑真实的IP地址,忽略虚拟机等IP地址的干扰 此代码中只要读取到了WiFi或者有线地址其中之一立即return. 微信搜索"HUC思梦"关注我吧,关注有惊喜,不定时有免费资源 ...

  5. JSP 获取访问者真正的IP地址

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

  6. Nginx在多层代理下获取真实客户端IP地址

    最近在研究nginx中如何获取真实客户端IP的方法.众所周知,在编译Nginx时,可通过添加http_realip_module模块来获取真实客户端IP地址.何为真实IP地址呢?请看下图,既获取到的真 ...

  7. 学习笔记 - Nginx在多层代理下获取真实客户端IP地址

    最近在研究nginx中如何获取真实客户端IP的方法.众所周知,在编译Nginx时,可通过添加http_realip_module模块来获取真实客户端IP地址.何为真实IP地址呢?请看下图,既获取到的真 ...

  8. HttpServletRequest、ServerHttpRequest获取访问者真实IP,并设置ip白名单

    在项目记录日志的时候和网关处理IP白名单的时候,通常会获取用户IP,一般都会从HttpServletRequest.ServerHttpRequest获取访问者真实IP 1.从HttpServletR ...

  9. android 打开wifi并链接到制定ip,当设备连接到Android中的WiFi时,如何获取蜂窝网络的IP地址...

    有没有办法我可以在 Android中同时获取WiFi和蜂窝网络的IP地址.我尝试使用很多例子,但是只能获得WiFi网络的地址而不是蜂窝网络.我启用了WiFi和蜂窝网络,设备正在通过WiFi上网. 以下 ...

最新文章

  1. 比特币ABC推出最新版本后讨论网络不兼容性
  2. 安全现状:从通杀到专杀
  3. JS-循环清空对象 判断数据类型的5种常用方法
  4. html5 canvas实际应用,Html5 Canvas入门及经典应用
  5. eclipse+ADT 进行android应用签名详解
  6. 7 招教你轻松搭建以图搜图系统!
  7. 什么是车联网?导航?听歌?智能语音识别?事实没这么简单!
  8. java jui 正则表达式_正则表达式-Gorilla City-51CTO博客
  9. 【原】Storm调度器
  10. 手机端通讯录制作,字母索引查找
  11. 方差,标准差,协方差,样本标准差,总体标准差,抽样平均误差
  12. 如何爬取中国近十年的GDP,对数据进行处理,并写入csv文件?
  13. Python 计算思维训练——公式编程
  14. Echarts绘制各种数据可视化图表案例(效果+代码)
  15. Datawhale组队学习周报(第046周)
  16. C语言入门题库——求2+22+222+......+22222的值
  17. 关于“上家公司离职原因”应聘者回答技巧分享
  18. python数据收集整理教案_数据收集整理教学设计
  19. pg预热插件pg_prewarm
  20. 双环形图表_excel两个环形图怎么画

热门文章

  1. echarts的人员迁徙地图动态效果
  2. JavaScript 判断数据类型的方法
  3. Html导出Excel文件(兼容所有浏览器,支持设置文件名)
  4. 解决Centos7下pip更新失败问题
  5. 财通基金VeriSign EV SSL证书网站可信服务
  6. (project generation have a problem)STM32CubeMX生成工程一直报错项目生成有问题[玄学三步解]
  7. 互联网大厂跑马圈地虚拟数字人,千亿市场爆发至少还要等上5年?
  8. 中国医用类金刚石碳涂层(DLC)行业市场供需与战略研究报告
  9. JavaScript算法之指针思想
  10. Linux脚本保存管道中的变量,Linux下管道重定向使用以及Shell编程(操作系统)