在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地址多中方法整合相关推荐

  1. Java获取请求客户端的真实IP地址

    整理网友的材料,最后有源码,亲测能解决所有java获取IP真实地址的问题 整理的这里: 1.链接1 2.链接2 JSP里,获取客户端的IP地址的方法是: request.getRemoteAddr() ...

  2. java 获取请求客户端的真实IP地址

    转载自:http://leiyongping88.iteye.com/blog/1545930 用request.getRemoteAddr(); 方法获取的IP地址是:127.0.0.1或192.1 ...

  3. 后台获取访问端的真实ip地址

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

  4. JavaWeb 获取客户端的真实IP地址

    通常我们在JavaWeb中获取客户端IP地址只需要使用request.getRemoteAddr();方法即可 如果前端使用了Nginx等反向代理的话,我们使用request.getRemoteAdd ...

  5. 获取本机的真实IP地址

    Code: import java.net.InetAddress; import java.net.UnknownHostException; /** * 获取本机的真实IP地址.<br> ...

  6. Java如何获取客户端主机真实IP地址

    项目开发中,小编遇到一种需求,就是将系统项目与某台主机的IP地址绑定,让该系统只能在某台主机上使用,不要问小编为什么,我也是第一次遇到这么奇怪的需求,当然也不要问小编为什么不使用权限控制,现在的权限控 ...

  7. java ip 获取了两个_用Java获取本地的多个IP地址

    翻API翻出来的,拿出来晒晒... 特别适用于获取本地的多个IP地址 import java.net.InetAddress; import java.net.NetworkInterface; im ...

  8. 获取微信浏览器的真实IP地址

    问题来源 获取用户客户端IP地址是一个很简单的需求.用户打开网页,发送一个HTTP请求,后台从中提取出IP地址. 但是,在使用微信打开网页时,发现获取到的IP地址和在浏览器打开所得到的IP地址不一样. ...

  9. python获取主机ip_Python 获取本地主机 hostname 和 IP 地址的简单方法

    Python 获取本地主机 hostname 很简单,一行代码就能搞定.获取 IP 地址也一样简单,下面分享一下这些方法.都很简单,基本都是通过 Python 的 socket 库来进行获取的.Pyt ...

最新文章

  1. lstm预测sin函数方法2思路的
  2. Redis与Memcached简要比较
  3. 使用face_recognition(二)目标人脸“实时”检测
  4. MySQL触发器使用详解
  5. CodeForces - 566A Matching Names(字典树上贪心)
  6. VSTS 离线源码版本辅助工具
  7. 近期新机发布一览:最便宜的只需699元!
  8. Java进阶篇设计模式之九----- 解释器模式和迭代器模式
  9. ubuntu 12.04 3D特效
  10. JAVA受检异常和非受检异常举例
  11. IEEE COMMUNICATIONS LETTERS 写作Latex模板
  12. 等保测评所需postgresql数据库命令以及内容解析
  13. 众数和中位数的应用题_什么是众数和中位数
  14. Mac运行pyinstaller打包exe 提示 command not found的终极解决办法!
  15. html改游戏聊天字体颜色,html点击按钮改变字体颜色怎么实现
  16. 利用Eclipse-Python简单爬取京东商城书籍信息进行可视化
  17. win10右键文件夹卡死未响应的解决方法
  18. 打开计算机首先映入眼帘的一整屏称之为桌面,利用“活动桌面” 让桌面也“闪”起来...
  19. 云虚拟主机☀️利用FileZilla,使用FTP协议给阿里云虚拟主机上传、下载文件
  20. python特征选择relieff图像特征优选_基于Relief特征选择算法的研究与应用

热门文章

  1. flutter 刷脸_GitHub - hqwlkj/wechat_face_payment: 微信刷脸支付、刷脸认证、扫码支持等 Flutter 插件....
  2. 小程序空显示undefined_微信小程序显示ESP8266上传的实时显示温湿度数据
  3. Python数据科学|第一章:数据科学家的武器库
  4. consul代理---健康检测
  5. Hbase 架构(未完待续)
  6. 在GDI+中如何实现以左下角为原点的笛卡尔坐标系
  7. (转载)查看Oracle字符集及怎样修改字符集
  8. 2013流行Python项目汇总
  9. Linux启动管理:grub
  10. Java知多少(81)框架窗口基础