blob的真实地址怎么获得_哎,我早就料到你获取IP地址的姿势不对啦!

作者:蔡永吉

链接:https://blog.csdn.net/takeurhand/article/details/52512200

想必大家对这段代码并不陌生:

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;}

是的,你搜索到的“java获取真实IP地址”大多都是如此。但是,以上代码真的对吗?

那么我们看一下具体的代码。如上,判断ip地址的优先级是

"x-forwarded-for">"Proxy-Client-IP">"WL-Proxy-Client-IP">request.getRemoteAddr()

其中带引号的都是从header中获取的。

等等!我们都知道header中的值是可以更改的。比如:

$.ajax({    type : "GET",    headers : {"X-Forwarded-For":randomIp,"WL-Proxy-Client-IP":randomIp},    contentType : 'application/x-www-form-urlencoded;charset=utf-8',    url : url,    data:params,    dataType : "text",    success : function(data) {        count++;        console.log("时间:【"+new Date()+"】 执行成功:【"+count+"】次:"+data);    if(max>0){        setTimeout(function wait(){            console.log("等待"+(timeWait)+"ms ...");            vote(max,getRandomNum(maxWait,minWait));        },timeWait);    }    }}

代码出自:https://github.com/caiyongji/vote-2.0/blob/master/Vote-2.0.js

其中headers属性X-Forwarded-For,WL-Proxy-Client-IP不就是被更改了吗?

那么,为什么会有这个版本的“java获取真实IP地址”的方法呢?并且搜索引擎所能检索到的结果大多都是这一个?

打个比方说,如果这个解决办法是一本秘籍的话,那么,我们找到的只是“java获取真实IP地址”残卷。

而剩下的部分在这里:

#Nginx 设置location  ~  ^/static {proxy_pass  ....;proxy_set_header X-Forward-For $remote_addr ;}

这段配置是在前端Nginx反向代理上的(其他反向代理请自行搜索),这段配置作的事情是将X-Forward-For替换为remote_addr,再将X-Forward-For在内网各服务器间安全传输。

这里我再针对TCP/IP多做一些解释,众所周知TCP/IP建立连接时需要三次握手的,并且,只有知道了client端请求的IP地址,server端的数据才能返回给client,所以client想要获取到数据就必须提供真实的IP(DDOS攻击除外),而request.getRemoteAddr()获取的就是用户最真实的IP。那么为什么不直接使用使用request.getRemoteAddr()这个方法呢?

如果没有反向代理的话当然可行。但是出于安全原因,现在大多数的服务都使用代理服务器(如Nginx,代理服务器可以理解为用户和服务器之间的中介,双方都可信任。),而用户对代理服务器发起的HTTP请求,代理服务器对服务集群中的真实部署的对应服务进行“二次请求”,所以最终获取的IP是代理服务器在内网中的ip地址,如192.168.xx.xx/10.xx.xx.xx等等。

所以在使用了反向代理的情况下,request.getRemoteAddr()获取的是反响代理在内网中的ip地址。所以在反向代理中将X-Forward-For替换为remote_addr,即,真实的IP地址。之后在内网中获取的x-forwarded-for便是真实的ip地址了。

最后给出完整解决方案(Nginx为例):

JAVA部分(自外国朋友Bashan):

6e118051bfce59faaff0ebc67371dfe7.png

Nginx部分(自月影无痕):

location  ~  ^/static {proxy_pass  ....;proxy_set_header X-Forward-For $remote_addr ;}

对了,在这里说一下,我目前是在职Java开发,如果你现在正在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中缺乏基础入门的视频教程,可以关注并私信我:01。获取。我这里有最新的Java基础全套视频教程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值