当前位置:

首页 > 编程开发 > springboot如何获取真实ip地址

springboot如何获取真实ip地址

需求是用户在登录时,密码输错了5次以上要将这个ip禁用,所以如题,我需要在登录接口代码中获得这次请求的原始ip地址。既然项目一般都是走nginx和网关代理,那肯定得百度了,于是百度的代码如下:/***获取ip地址**@paramrequest*@return*/publicStringgetIpAddr(HttpServletRequestrequest){Stringip=request.getHeader("X-Real-IP");if(ip!=null&&!"".equals(ip)&&!"unkn

本文目录

    需求是用户在登录时,密码输错了5次以上要将这个ip禁用,所以如题,我需要在登录接口代码中获得这次请求的原始ip地址。

    既然项目一般都是走nginx和网关代理,那肯定得百度了,于是百度的代码如下:

        /**
         * 获取ip地址
         *
         * @param request
         * @return
         */
        public String getIpAddr(HttpServletRequest request) {
            String ip = request.getHeader("X-Real-IP");
            if (ip != null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
                return ip;
            }
            ip = request.getHeader("X-Forwarded-For");
            if (ip != null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
                int index = ip.indexOf(',');
                if (index != -1) {
                    return ip.substring(0, index);
                } else {
                    return ip;
                }
            } else {
                return request.getRemoteAddr();
            }
        }

    然后我模拟2个用户测了一下(测试结果为化名):

    • 公司电脑本地启服务,注册到公司开发环境的nacos上,通过网关调用此登录接口

    • 用另一台电脑连公司vpn,其余步骤如上。

    • request.getHeader("X-Real-IP") 获取的ip地址始终固定是:115.1.2.3

    • request.getHeader("X-Forwarded-For")获取的结果固定是: 115.1.2.3,10.x.x.x

      • 结果是一个字符串,第一个值与X-Real-IP值一样。

      • 第二个值一直在动态变化

    • request.getRemoteAddr()获取的结果固定是: 192.168.1.10

    所以我很疑惑,首先看了下公司日志过滤器那块代码也正是用的上面的方法,完全一样。那么说明是一样的。

    这方法正确吗?

    大概看了下这方法逻辑就是先获取请求体的realIp,获取不到才去获取forward啥的ip。

    那我这边为什么始终能获取到realIp且始终固定1个值,我已经模拟了2个用户来登录了。

    那不是起不到不同ip的效果了吗。

    所以我怀疑是不是这个115.1.2.3是网关还是哪台服务器的ip。

    为什么X-Forwarded-For的第一个值与realIp一样且第二个值一直变。且第二个值代表什么ip,为什么一直在变。此刻我怀疑是不是就是我2台电脑的无线网动态变化的ip,那么这么看我得取这第二个值了。

    带着这些疑惑,真的很菜的我继续百度+咨询公司运维+最终询问领导。

    得到了以下结论:

    首先明确request.getRemoteAddr()这块不能要。一看就是内网ip,不然直接锁死了。

    在jax的告诫"去掉这块代码,让其为空则不禁用,否则内网锁定ip,且很可能是用户微服务集群2台的ip,那就都不能登录了"下,我删掉了这块代码。

    且最终咨询了运维之后发现这个固定的192.168.1.10正是开发环境的K8S地址!那确实不能返回!

    realIp固定的115.1.2.3问了运维大哥后知道了是真实ip地址!不是内网地址!且是公司的网关地址。

    那我明白了,我连公司vpn及我公司电脑其实都是连的公司wifi,所以最终请求发出去都是走的公司网关,此网关不是web项目的网关!

    所以最终地址都一致。那这么看满足需求,1个人连的1个wifi,不能连续输错密码5次否则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 getIpAddr(HttpServletRequest request) {
            //目前则是网关ip
            String ip = request.getHeader("X-Real-IP");
            if (ip != null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
                return ip;
            }
            ip = request.getHeader("X-Forwarded-For");
            if (ip != null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
                int index = ip.indexOf(',');
                if (index != -1) {
                	//只获取第一个值
                    return ip.substring(0, index);
                } else {
                    return ip;
                }
            } else {
            	//取不到真实ip则返回空,不能返回内网地址。
                return "";
            }
        }
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 ip地址
    相关文章 更多
    电脑网线连接不上网络怎么回事排查与解决教程
    电脑网线连接不上网络怎么回事排查与解决教程

    电脑插上网线却显示无网络?本教程带你从物理接口、网卡状态到系统设置逐一排查,解决因接触不良、IP配置错误或驱动异常导致的有线网络中断问题。

    Ubuntu系统中怎么设置IP地址?
    Ubuntu系统中怎么设置IP地址?

    如何在Ubuntu系统中轻松配置有线网络IP地址 从Windows转向Ubuntu系统时,第一步往往是让新系统顺利联网。这一步很关键——不仅能方便地安装各类软件,还能随时获取系统更新,让整个使用体验流畅起来。那么,如何在Ubuntu下高效地设置有线网络的IP地址呢?这套操作流程同样能帮你恢复自动获取

    Win11查看IP地址及网络信息方法
    Win11查看IP地址及网络信息方法

    Windows11中查看以太网IPv4地址有五种方法:一、设置→网络和Internet→以太网→IP分配区;二、任务栏网络图标右键→网络和Internet设置→连接属性;三、cmd中运行ipconfig;四、PowerShell中运行Get-NetIPAddress筛选;五、ncpa.cpl→以太网状态→详细信息。

    Win11查看IP地址方法:ipconfig与网络设置教程
    Win11查看IP地址方法:ipconfig与网络设置教程

    1、通过命令提示符输入ipconfig可查看IPv4地址;2、设置中进入网络属性可直接查看IP分配信息;3、控制面板的网络共享中心详细信息中也显示IPv4地址。

    PHP获取用户真实IP的正确方法
    PHP获取用户真实IP的正确方法

    答案:在PHP中,$_SERVER['REMOTE_ADDR']不总是真实IP,因为当请求经过CDN、负载均衡或反向代理时,该值仅为代理服务器IP。真实客户端IP通常由代理服务器通过HTTP头如X-Forwarded-For或X-Real-IP传递。为获取可信IP,应优先解析这些头信息,并结合信任代理IP范围和IP有效性验证(如过滤私有IP),防止IP欺骗。最安全的做法是在Web服务器(如Nginx)层面配置real_ip_header和set_real_ip_from,将真实IP写入REMOTE_ADD

    PHP获取客户端IP地址的正确方法
    PHP获取客户端IP地址的正确方法

    答案:PHP获取客户端IP需综合$_SERVER['REMOTE_ADDR']、$_SERVER['HTTP_X_FORWARDED_FOR']等变量,优先取代理头中的第一个IP并验证有效性。应结合filter_var()校验IP格式,区分IPv4/IPv6,仅信任可信代理,记录多源IP以备分析,无单一最佳方案,需根据服务器环境调整策略。

    Win8查看本机IP地址方法
    Win8查看本机IP地址方法

    首先通过命令提示符输入ipconfig查询IP地址,其次可通过网络共享中心查看连接详情,最后在系统设置中直接访问网络状态获取IPv4地址。

    网络与IP地址有何关联?
    网络与IP地址有何关联?

    IP地址是设备在网络中的唯一标识,如同门牌号,而网络则是其归属的空间;两者相辅相成,缺一不可。

    如何在 Go 中用正则表达式匹配 IP 地址?
    如何在 Go 中用正则表达式匹配 IP 地址?

    如何在Go中使用正则表达式匹配IP地址?正则表达式语法:^(([0-9]|1-9|1[0-9]{2}|20-4|25[0-5]).){3}([0-9]|1-9|1[0-9]{2}|20-4|25[0-5])$Go代码示例:使用regexp.MatchString()函数进行匹配。实战案例:使用regexp.MustCompile()函数从字符串中替换所有IP地址。

    如何在 PHP 中使用正则表达式来匹配 Apache 访问日志中的 IP 地址
    如何在 PHP 中使用正则表达式来匹配 Apache 访问日志中的 IP 地址

    Apache访问日志是Apache服务器记录客户端请求和服务器响应的一种形式。该日志中包含了每个请求的详细信息,包括客户端的IP地址、请求的时间、请求的URL地址等信息。在PHP开发过程中,我们有时需要从访问日志中获取客户端的IP地址。为此,我们可以使用PHP中的正则表达式进行匹配。以下是如何在PHP中使用正则表达式来匹配Apache访问日志中的IP地

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。