SpringBoot如何获取客户端的IP地址

 更新时间:2024年05月06日 14:51:45   作者:沙漠真有鱼  
这篇文章主要介绍了SpringBoot如何获取客户端的IP地址问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

在Web应用程序中,获取客户端的IP地址是一项非常常见的需求,例如记录访问日志、过滤恶意IP等。

在本文中,我们将介绍如何使用Spring Boot框架获取客户端的IP地址。

方法一

使用ServletRequest对象获取IP地址

Spring Boot应用程序可以使用HttpServletRequest对象获取客户端的IP地址。

在Spring Boot中,可以通过注入HttpServletRequest作为一个参数来获取该对象。

@GetMapping("/getIp")
public String getIp(HttpServletRequest request) {
    String ipAddress = request.getRemoteAddr();
    return "Client IP address: " + ipAddress;
}

上述代码中,我们通过调用 request.getRemoteAddr() 方法获取客户端的IP地址。

方法二

使用ServletRequestAttributes对象获取IP地址

除了使用HttpServletRequest对象外,Spring Boot还提供了另一种获取客户端IP地址的方法。

这种方法是使用ServletRequestAttributes对象,在方法中注入该对象即可。

代码如下:

@GetMapping("/getIp2")
public String getIp2(ServletRequest request) {
    String ipAddress = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest().getRemoteAddr();
    return "Client IP address: " + ipAddress;
}

在上面的代码中,我们通过 RequestContextHolder.currentRequestAttributes()方法获取当前的HttpServletRequest对象

再通过 getRequest().getRemoteAddr() 方法获取客户端的IP地址。

注意事项

虽然以上两种方法可以获取客户端的IP地址,但需要注意以下几个问题:

  • 如果应用程序部署在反向代理服务器后面,使用上述方法获取的IP地址可能是反向代理服务器的IP地址,而不是客户端真正的IP地址。
  • 有些客户端可能使用了匿名代理服务器,例如TOR等,此时获取到的IP地址不是客户端真正的IP地址。

解决方案

使用X-Forwarded-For头

为了解决上述问题,我们可以使用X-Forwarded-For头。

该头字段是一个逗号分隔的IP地址列表,最左边的IP地址是客户端的真实IP地址。

以下是使用X-Forwarded-For头获取客户端IP地址的示例代码。

@GetMapping("/getIp3")
public String getIp3(HttpServletRequest request) {
    String ipAddress = request.getHeader("X-Forwarded-For");
    if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("Proxy-Client-IP");
    }
    if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getRemoteAddr();
    }
    return "Client IP address: " + ipAddress.split(",")[0];
}

上述代码中,我们首先使用 request.getHeader("X-Forwarded-For") 方法获取X-Forwarded-For头字段的值,如果获取失败,则尝试使用其他头字段。

最后,我们通过逗号对IP地址进行分割,获取最左边的IP地址,即客户端的真实IP地址。

总结

本文介绍了使用Spring Boot框架获取客户端IP地址的三种方法:

  • 1.使用HttpServletRequest对象
  • 2.使用ServletRequestAttributes对象
  • 3.使用X-Forwarded-For头

当我们需要获取客户端的真实IP地址时,应该使用X-Forwarded-For头解决代理服务器和匿名代理服务器的问题。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MyBatis使用接口映射的方法步骤

    MyBatis使用接口映射的方法步骤

    映射器是MyBatis中最核心的组件之一,本文主要介绍了MyBatis使用接口映射的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Java基础之String类使用与字符串比较

    Java基础之String类使用与字符串比较

    String类代表字符串,java程序中的所有字符串文字(例如"abc")都被实现为此类的实例。本文将详解String类的使用,以及如何进行字符串比较
    2022-08-08
  • Windows 10卸载JDK1.8超详细图文教程

    Windows 10卸载JDK1.8超详细图文教程

    这篇文章主要介绍了Windows 10卸载JDK1.8超详细图文教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Spring @Scheduled的坑及解决

    Spring @Scheduled的坑及解决

    这篇文章主要介绍了Spring @Scheduled的坑及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • IDEA设置生成带注释的getter和setter的图文教程

    IDEA设置生成带注释的getter和setter的图文教程

    通常我们用idea默认生成的getter和setter方法是不带注释的,当然,我们同样可以设置idea像MyEclipse一样生成带有Javadoc的模板,具体设置方法,大家参考下本文
    2018-05-05
  • jdk17+springboot使用webservice的踩坑实战记录

    jdk17+springboot使用webservice的踩坑实战记录

    这篇文章主要给大家介绍了关于jdk17+springboot使用webservice踩坑的相关资料,网上很多教程是基于jdk8的,所以很多在17上面跑不起来,折腾两天,直接给答案,需要的朋友可以参考下
    2024-01-01
  • Java内存管理垃圾回收基础详解

    Java内存管理垃圾回收基础详解

    这篇文章主要为大家介绍了Java内存管理垃圾回收基础详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 基于Java实现一个复杂关系表达式过滤器

    基于Java实现一个复杂关系表达式过滤器

    这篇文章主要为大家详细介绍了如何基于Java实现一个复杂关系表达式过滤器。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-07-07
  • java解析xml之sax解析xml示例分享

    java解析xml之sax解析xml示例分享

    SAX基于事件的解析,解析器在一次读取XML文件中根据读取的数据产生相应的事件,由应用程序实现相应的事件处理逻辑,即它是一种“推”的解析方式;这种解析方法速度快、占用内存少,但是它需要应用程序自己处理解析器的状态,实现起来会比较麻烦
    2014-01-01
  • Java中Map的computeIfAbsent方法详解

    Java中Map的computeIfAbsent方法详解

    这篇文章主要介绍了Java的Map中computeIfAbsent方法详解,在jdk1.8中Map接口新增了一个computeIfAbsent方法,这是Map接口中的默认实现该方法是首先判断缓存Map中是否存在指定的key的值,如果不存在,会调用mappingFunction(key)计算key的value,需要的朋友可以参考下
    2023-11-11

最新评论