当前位置: 首页 > news >正文

【转载】JSP 获取真实IP地址的代码

JSP 获取真实IP地址的代码

在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地址的方法一: 
代码如下:
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 }
获得客户端真实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

转载于:https://www.cnblogs.com/tengqiuyu/p/7294319.html

相关文章:

  • 【转】XML string 转datagrid datatable dataset
  • 设计原则之宜家效应:如何让人们爱上你的产品
  • IE6 DIV height 最小高度解决方法
  • svn报错can only be performed on a version resource [at this time].
  • C++ 中的强制类型转换
  • pycharm引入django
  • log
  • 360安全卫士升级致Win7/vista电脑不能上网
  • Leet Code OJ 219. Contains Duplicate II [Difficulty: Easy]
  • max(min)-device-width和max(min)-width的区别
  • 《掌控Windows SErver 2008 活动目录》 电子文档 下载 清华出版社
  • 深入浅出TensorFlow(七)TensorFlow计算加速
  • MapViewOfFile
  • mysql source 恢复 sql数据time_zone报错 已解决
  • 有效IT运维 效率提高 成本降低
  • 分享一款快速APP功能测试工具
  • 10个确保微服务与容器安全的最佳实践
  • 30天自制操作系统-2
  • centos安装java运行环境jdk+tomcat
  • co模块的前端实现
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Lsb图片隐写
  • nginx 负载服务器优化
  • PhantomJS 安装
  • PHP变量
  • Redis 中的布隆过滤器
  • Swift 中的尾递归和蹦床
  • 测试开发系类之接口自动化测试
  • 初探 Vue 生命周期和钩子函数
  • 大数据与云计算学习:数据分析(二)
  • 翻译:Hystrix - How To Use
  • 猴子数据域名防封接口降低小说被封的风险
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 聊聊flink的TableFactory
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前嗅ForeSpider教程:创建模板
  • 源码安装memcached和php memcache扩展
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • (31)对象的克隆
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (一)python发送HTTP 请求的两种方式(get和post )
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net mvc 获取url中controller和action
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 解决重复提交问题
  • .Net(C#)自定义WinForm控件之小结篇
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @Pointcut 使用
  • [ IO.File ] FileSystemWatcher
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [C++]Leetcode17电话号码的字母组合
  • [C++]指针与结构体
  • [EFI]ASUS EX-B365M-V5 Gold G5400 CPU电脑 Hackintosh 黑苹果引导文件