多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.javapeixun.com.cn / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.javapeixun.com.cn /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.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地址的方法二:
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
以上方法还不行的话就采用如下方法:
/*** 获取当前网络ip* @param request* @return*/public String getIpAddr(HttpServletRequest request){String ipAddress = request.getHeader("x-forwarded-for");if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = request.getHeader("Proxy-Client-IP");}if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = request.getHeader("WL-Proxy-Client-IP");}if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = request.getRemoteAddr();if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){//根据网卡取本机配置的IPInetAddress inet=null;try {inet = InetAddress.getLocalHost();} catch (UnknownHostException e) {e.printStackTrace();}ipAddress= inet.getHostAddress();}}//对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15if(ipAddress.indexOf(",")>0){ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));}}return ipAddress; }
多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合相关推荐
- Java获取请求客户端的真实IP地址
整理网友的材料,最后有源码,亲测能解决所有java获取IP真实地址的问题 整理的这里: 1.链接1 2.链接2 JSP里,获取客户端的IP地址的方法是: request.getRemoteAddr() ...
- java 获取请求客户端的真实IP地址
转载自:http://leiyongping88.iteye.com/blog/1545930 用request.getRemoteAddr(); 方法获取的IP地址是:127.0.0.1或192.1 ...
- 后台获取访问端的真实ip地址
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid,nginx等反向代理软件就不能获取到客 ...
- JavaWeb 获取客户端的真实IP地址
通常我们在JavaWeb中获取客户端IP地址只需要使用request.getRemoteAddr();方法即可 如果前端使用了Nginx等反向代理的话,我们使用request.getRemoteAdd ...
- 获取本机的真实IP地址
Code: import java.net.InetAddress; import java.net.UnknownHostException; /** * 获取本机的真实IP地址.<br> ...
- Java如何获取客户端主机真实IP地址
项目开发中,小编遇到一种需求,就是将系统项目与某台主机的IP地址绑定,让该系统只能在某台主机上使用,不要问小编为什么,我也是第一次遇到这么奇怪的需求,当然也不要问小编为什么不使用权限控制,现在的权限控 ...
- java ip 获取了两个_用Java获取本地的多个IP地址
翻API翻出来的,拿出来晒晒... 特别适用于获取本地的多个IP地址 import java.net.InetAddress; import java.net.NetworkInterface; im ...
- 获取微信浏览器的真实IP地址
问题来源 获取用户客户端IP地址是一个很简单的需求.用户打开网页,发送一个HTTP请求,后台从中提取出IP地址. 但是,在使用微信打开网页时,发现获取到的IP地址和在浏览器打开所得到的IP地址不一样. ...
- python获取主机ip_Python 获取本地主机 hostname 和 IP 地址的简单方法
Python 获取本地主机 hostname 很简单,一行代码就能搞定.获取 IP 地址也一样简单,下面分享一下这些方法.都很简单,基本都是通过 Python 的 socket 库来进行获取的.Pyt ...
最新文章
- lstm预测sin函数方法2思路的
- Redis与Memcached简要比较
- 使用face_recognition(二)目标人脸“实时”检测
- MySQL触发器使用详解
- CodeForces - 566A Matching Names(字典树上贪心)
- VSTS 离线源码版本辅助工具
- 近期新机发布一览:最便宜的只需699元!
- Java进阶篇设计模式之九----- 解释器模式和迭代器模式
- ubuntu 12.04 3D特效
- JAVA受检异常和非受检异常举例
- IEEE COMMUNICATIONS LETTERS 写作Latex模板
- 等保测评所需postgresql数据库命令以及内容解析
- 众数和中位数的应用题_什么是众数和中位数
- Mac运行pyinstaller打包exe 提示 command not found的终极解决办法!
- html改游戏聊天字体颜色,html点击按钮改变字体颜色怎么实现
- 利用Eclipse-Python简单爬取京东商城书籍信息进行可视化
- win10右键文件夹卡死未响应的解决方法
- 打开计算机首先映入眼帘的一整屏称之为桌面,利用“活动桌面” 让桌面也“闪”起来...
- 云虚拟主机☀️利用FileZilla,使用FTP协议给阿里云虚拟主机上传、下载文件
- python特征选择relieff图像特征优选_基于Relief特征选择算法的研究与应用
热门文章
- flutter 刷脸_GitHub - hqwlkj/wechat_face_payment: 微信刷脸支付、刷脸认证、扫码支持等 Flutter 插件....
- 小程序空显示undefined_微信小程序显示ESP8266上传的实时显示温湿度数据
- Python数据科学|第一章:数据科学家的武器库
- consul代理---健康检测
- Hbase 架构(未完待续)
- 在GDI+中如何实现以左下角为原点的笛卡尔坐标系
- (转载)查看Oracle字符集及怎样修改字符集
- 2013流行Python项目汇总
- Linux启动管理:grub
- Java知多少(81)框架窗口基础