Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(www.javaxxz.com)已经为数万Java学习者服务超过7年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:http://item.taobao.com/item.htm?id=44171550842
成为荣耀会员,分享5TB资料及站长学习指导,购买链接:https://item.taobao.com/item.htm?id=44435180049
技术售后:点击这里给我发消息 资料售后:点击这里给我发消息 ①群:Java学习者群②javaxxz.com ②群:Java学习者群③javaxxz.com 求职招聘群:Java求职与招聘 精英群:Java学习者精英群
JavaEE 49期就业班视频教程Java从菜鸟到大神的学习路线之基础篇Java从菜鸟到大神的学习路线之实战篇Java从菜鸟到大神的学习路线之高级篇

价值两万达内2017年最新Java整套视频

Java开发视频教程下载

大数据开发视频教程

前端开发视频教程下载

安卓开发视频教程下载

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
查看: 109|回复: 0

[默认分类] 根据Request获取客户端IP

[复制链接]
  • TA的每日心情
    开心
    2018-8-25 14:10
  • 签到天数: 222 天

    [LV.7]常住居民III

    发表于 2018-7-13 15:48:50 | 显示全部楼层 |阅读模式

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
    如果使用了反向代理软件,将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地址的方法一:

    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. }
    复制代码

      
    可是当我访问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地址的方法二:

    1.         public String getRemoteHost(javax.servlet.http.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.equals("0:0:0:0:0:0:0:1")?"127.0.0.1":ip;
    13.         }
    复制代码

      
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    .

    QQ|手机版|Java学习者论坛

    GMT+8, 2018-11-19 13:33 , Processed in 0.325558 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表