【SpringBoot】SpringBoot获取不到用户真实IP怎么办

这篇具有很好参考价值的文章主要介绍了【SpringBoot】SpringBoot获取不到用户真实IP怎么办。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

项目部署后发现服务端无法获取到客户端真实的IP地址,这是怎么回事呢?给我都整懵逼了,经过短暂的思考,我发现了问题的真凶,那就是我们使用了Nginx作的请求转发,这才导致了获取不到客户端真实的IP地址,害,看看我是怎么解决的吧!

问题原因

客户端请求数据时走的是Nginx反向代理,默认情况下客户端的真实IP地址会被其过滤,使得SpringBoot程序无法直接获得真实的客户端IP地址,获取到的都是Nginx的IP地址。

解决方案

通过更改Nginx配置文件将客户端真实的IP地址加到请求头中,这样就能正常获取到客户端的IP地址了,下面我一步步带你看看如何配置和获取。

修改Nginx配置文件

在需要做请求转发的配置里添加下面的配置

#这个参数设置了HTTP请求头的Host字段,host表示请求的Host头,也就是请求的域名。通过这个设置,Nginx会将请求的Host头信息传递给后端服务。
proxy_set_header Host $host;
#这个参数设置了HTTP请求头的X−Real−IP字段,remote_addr表示客户端的IP地址。通过这个设置,Nginx会将客户端的真实IP地址传递给后端服务
proxy_set_header X-Real-IP $remote_addr;
#这个参数设置了HTTP请求头的 X-Forwarded-For字段,"X-Forwarded-For"是一个标准的HTTP请求头,用于表示HTTP请求经过的代理服务器链路信息,proxy_add_x_forwarded_for表示添加额外的服务器链路信息。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

修改后我的nginx.conf中的server如下所示
nginx复制代码

server {
  listen 443 ssl;
  server_name xxx.com;

  ssl_certificate "ssl证书pem文件";
  ssl_certificate_key "ssl证书key文件";
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  ssl_prefer_server_ciphers on;

  location / {
    root   前端html文件目录;
    index  index.html index.htm;
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root html;
  }
  # 关键在下面这个配置,上面的配置自己根据情况而定就行
  location /hello{
    proxy_pass http://127.0.0.1:8090;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

SpringBoot代码实现

第一种方式:在代码中直接通过X-Forwarded-For获取到真实IP地址

@Slf4j
public class CommonUtil {
    /**
     * <p> 获取当前请求客户端的IP地址 </p>
     *
     * @param request 请求信息
     * @return ip地址
     **/
    public static String getIp(HttpServletRequest request) {
        if (request == null) {
            return null;
        }
        String unknown = "unknown";
        // 使用X-Forwarded-For就能获取到客户端真实IP地址
        String ip = request.getHeader("X-Forwarded-For");
        log.info("X-Forwarded-For:" + ip);
        if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
            log.info("Proxy-Client-IP:" + ip);
        }
        if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
            log.info("WL-Proxy-Client-IP:" + ip);
        }
        if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            log.info("HTTP_X_FORWARDED_FOR:" + ip);
        }
        if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED");
            log.info("HTTP_X_FORWARDED:" + ip);
        }
        if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_CLUSTER_CLIENT_IP");
            log.info("HTTP_X_CLUSTER_CLIENT_IP:" + ip);
        }
        if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
            log.info("HTTP_CLIENT_IP:" + ip);
        }
        if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_FORWARDED_FOR");
            log.info("HTTP_FORWARDED_FOR:" + ip);
        }
        if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_FORWARDED");
            log.info("HTTP_FORWARDED:" + ip);
        }
        if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_VIA");
            log.info("HTTP_VIA:" + ip);
        }
        if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
            ip = request.getHeader("REMOTE_ADDR");
            log.info("REMOTE_ADDR:" + ip);
        }
        if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
            log.info("getRemoteAddr:" + ip);
        }
        return ip;
    }

第二种方式:在application.yml文件中加以下配置,直接通过request.getRemoteAddr()并可以获取到真实IP文章来源地址https://www.toymoban.com/news/detail-656392.html

server:
  port: 8090
  tomcat:
    #Nginx转发 获取客户端真实IP配置
    remoteip:
      remote-ip-header: X-Real-IP
      protocol-header: X-Forwarded-Proto

到了这里,关于【SpringBoot】SpringBoot获取不到用户真实IP怎么办的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电脑检测不到无线网络信号怎么办?

    昨天上网还正常呢,今天打开电脑就搜索不到无线信号了,路由和猫都正常,电脑的无线网卡也是开着的,一直没动过,哪位高手帮帮忙。谢谢 你的问题可能有2种,一个是无线网卡接触不良,可以重新插拔一下无线网卡尝试.另外的一个就是路由器的信道问题,我之前公司的网络

    2024年02月05日
    浏览(47)
  • 电脑屏幕亮度怎么调节?台式电脑找不到屏幕亮度怎么办

    我们在使用电脑的时候,经常会觉得电脑屏幕的亮度太亮了或者是太暗了。这个时候通常就要去调节电脑屏幕亮度。电脑屏幕亮度怎么调节?台式电脑找不到屏幕亮度怎么办?下面小编给大家带来了调节电脑屏幕亮度的详细教程。   电脑太亮了或者太暗了,想要调节电脑屏幕

    2024年02月10日
    浏览(52)
  • 计算机中丢失msvcr120.dll怎么办,电脑找不到msvcr120.dll怎么办

    电脑提示msvcr120.dll丢失是一个常见的问题,这个问题通常会在你尝试打开某些程序或游戏时出现。这个问题的原因是因为你的电脑缺少了一个名为msvcr120.dll的文件,这个文件是微软Visual C++ Redistrle for Visualv 2013的一部分。如果你遇到了这个问题,不要担心,下面是三种解决方法

    2024年02月13日
    浏览(41)
  • 由于找不到concrt140.dll怎么办?

    最近有用户反应之前打开软件是可以用的 但是今天打开就跳出这个对话框了 :由于找不到CONCRT140.dll,无法继续执行代码。重新安装程序可能会解决此问题。下面小编就为大家带来解决方法介绍! 提示“由于找不到concrt140.dll,无法继续执行代码”怎么解决? 1、下载一个 D

    2024年02月12日
    浏览(30)
  • app渗透测试抓不到数据包怎么办?

    1、app渗透测试常见的模拟器有夜神,闪电模拟器等。 2、遇到问题,数据包抓不到? (1)最常见的解决方法调低模拟器安卓版本,使用MuMu模拟器,大部分app都适用,但是也有些app无法抓取。 (2)安装证书到系统根证书,可以解决上面的问题(一般情况下手机在安装了BurpSuite的伪证

    2024年02月13日
    浏览(27)
  • 电脑提示“系统找不到指定的文件”怎么办?

    “系统找不到指定的文件” 对于Windows用户来说是一个很常见的错误,尤其是Win10用户,经常会遇到Win10提示找不到指定文件。在此错误后面有时还会出现错误代码:0x80070002,但是,故障类型或代码在不同的操作系统规范上是不同的。 当您安装磁盘驱动程序、制作系统映像、

    2024年02月09日
    浏览(38)
  • git切换分支提示找不到分支怎么办

    随着代码学习的深入,越来越多人使用github或者gitlab进行项目管理,这就会涉及到一些远程操作。比如的ssh配置在linux+gitlab 还有本文的主角:仓库分支的切换不成功。 分支可以基于现有分支进行创建,方便在现有代码上实现或者测试一些新的功能,而不会污染原始的分支上

    2024年02月07日
    浏览(36)
  • Win11找不到显卡控制面板怎么办?

    很多朋友玩游戏需要通过显卡控制面板来进行一些设置,使画质更好一些,提高帧数,增强游戏体验,不过有一些用户找不到win11显卡控制面板在哪里,今天来详细给朋友们进行介绍。 更多重装系统教程尽在 小白系统重装官网 1、若是Win10,在桌面点击右键就可以看到相关选

    2024年02月07日
    浏览(35)
  • 优酷路由宝赚不到金币该怎么办?

    现在许多朋友都抢到了优酷路邮宝。但是使用了一段时间后却发现,赚到的有金币很少甚至一个都没有赚到,针对小伙伴的疑问,你给大家分析一下原因。 1、网速,网速不给力。像小编这网速,是很难赚到金币的。 2、在网速不给力的情况下还有多个移动设备接入。 3、赚钱

    2024年02月08日
    浏览(31)
  • Selenium定位不到元素怎么办?一定要这么做

    在使用Selenium进行自动化测试时,碰到无法定位元素该怎么办?这里总结了9种情况下的元素定位方法: 1、frame/iframe表单嵌套 WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌的页面元素无法直接定位。 解决方法: switch_to.frame() 默认可以直接取表单的id或

    2024年03月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包