spring boot 获取ip,spring获取请求的ip地址

  spring boot 获取ip,spring获取请求的ip地址

  要求用户登录时密码输错5次以上,这个ip就要禁用,所以如上所述,我需要在登录接口代码中获取这个请求的原始ip地址。禁用ip的逻辑已经写好了。目前的痛点是获取ip地址,就是这个代码让我被领导抓了。

  由于项目通常采取nginx和网关代理,所以必须是百度,所以百度的代码如下:3360。

  /* * *获取ip地址* * @ param request * @ return */public string geti padr(http servlet request request){ string IP=request . Get header( x-real-IP );如果(ip!=null!.等于(ip)!“未知”。equalsIgnoreCase(IP)){ return IP;} IP=request . get header( X-forward-For );如果(ip!=null!.等于(ip)!“未知”。equalsIgnoreCase(IP)){ int index=IP . index of(,);如果(索引!=-1) { return ip.substring(0,索引);} else { return ip} } else { return request . getremote addr();}}然后我模拟了2个用户测试了一下(测试结果是化名):

  公司在本地启动服务,在公司开发环境的nacos上注册,通过网关调用这个登录接口,将公司vpn连接到另一台电脑上。其余步骤同上。request.getHeader(X-Real-ip )获取的IP地址始终固定为:115.1.2.3。request . get header( x-forwarded-for )得到的结果固定在3360 115.1.2.3,10.x.x.x的结果是a,第二个值保持动态变化。request.getRemoteAddr()得到的结果固定为: 192.168.1.10,我很困惑。首先我看了一下公司日志过滤器的代码,和上面的方法一模一样。那么解释也是一样的。

  这种方法对吗?

  看了一下这个方法,逻辑是先得到请求体的realIp,如果得不到就得到forward什么的Ip。

  那为什么我总能得到realIp,总能固定一个值?我已经模拟了两个用户登录。

  我以为不同的ip不能用。

  所以我想知道这个115.1.2.3是网关还是哪个服务器的ip。

  为什么X-Forwarded-For的第一个值和realIp一样,第二个值一直变。第二个值代表什么ip以及它为什么不断变化。此刻我在想是不是我两台电脑无线网络的动态ip,所以我要取这第二个值。

  带着这些疑惑,我真的很好吃。我继续百度咨询公司的运维,最后请教各位领导。

  得出以下结论:3360

  首先明确request.getRemoteAddr()这一块不是必须的。只看内网ip,不然直接被锁定。

  在jax的告诫下,‘去掉这段代码,让它空着,它就不会工作。否则内网会锁定ip,而且很可能是两个用户微服务集群的ip,所以无法登录,我删除了这段代码。

  最后咨询了运维,发现这个固定的192.168.1.10是开发环境的K8S地址!那真的退不回来了!

  115.1.2.3的realIp是固定的,问了运维哥才知道是真实的Ip地址!不是内部网地址!并且是公司的网关地址。

  然后我看到,我的公司vpn,我的公司电脑,其实都是连接公司wifi的,所以最后的请求是通过公司网关发出去的,并不是web项目的网关!

  所以最后的地址是一样的。所以能满足需求。如果一个人连一个wifi,不能连续五次输错密码,否则ip会被禁用,甚至其他方式wifi也一样。

  “X-Forwarded-For”的第一个值和它的realIo一样,应该是我只有1个代理。这里确实只有Nginx代理。

  所以“X-Forwarded-For”的第二个值从代理服务器的地址开始。

  在咨询了jax并让运维看了一下之后,我找到了k8s的一些容器的地址。

  只是奇怪为什么这个地址一直在变,jax。我量过了。每次都会变。

  所以原来的方法是对的,只求forward的第一个值!

  “X-Forwarded-For”字面意思是“为谁转发”,其形式与“Via”类似,即每次经过代理节点时,都会在字段后追加一条消息。但是“Via”附加的是代理主机名(或域名),而“X-Forwarded-For”附加的是请求者的IP地址。因此,字段中最左边的IP地址是客户端的地址。

  “X-Real-IP”是获取客户端真实IP的另一种手段。它的作用很简单,就是记录客户端的IP地址,不需要中间的代理信息,相当于简化版的“X-Forwarded-For”。如果客户机和源服务器之间只有一个代理,那么这两个字段的值是相同的。

  所以最后修改的代码是:

  /* * *不返回内网地址获取真实ip地址* * @ param request * @ return */public string getipadr(http servlet request request){//目前是网关IP string IP=request . Get header( x-real-IP );如果(ip!=null!.等于(ip)!“未知”。equalsIgnoreCase(IP)){ return IP;} IP=request . get header( X-forward-For );如果(ip!=null!.等于(ip)!“未知”。equalsIgnoreCase(IP)){ int index=IP . index of(,);如果(索引!=-1) {//只获取第一个值返回ip.substring(0,index);} else { return ip}} else {//获取不到真实ip就返回null,不能返回内网地址。返回“”;} }总结

  关于springboot获取真实ip地址的文章到此结束。关于springboot获取真实ip内容的更多信息,请搜索风行IT之前的文章或者继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: