Spring中获取HttpServletRequest的三种方式小结

 更新时间:2026年04月14日 09:29:59   作者:爱码少年 00fly.online  
spring框架web环境中,获取HttpServletRequest是常见的操作,本文将为大家详细介绍一下Spring中获取HttpServletRequest的三种方式,有需要的小伙伴可以了解下

一、简要概述

spring框架web环境中,获取HttpServletRequest是常见的操作,下面我们以获取客户端ip功能为例,给出获取HttpServletRequest对象的几种方式。

二、3种方式

1、直接在请求方法参数中声明

    String[] IP_HEADERS = {"X-Forwarded-For", "X-Real-IP", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR"};
    
    @GetMapping({"/", "/index"})
    public String index(HttpServletRequest request)
    {
        return StringUtils.join("client ip: ", getClientIp(request));
    }
    
    /**
     * 获取客户端真实IP地址
     */
    private String getClientIp(HttpServletRequest request)
    {
        for (String header : IP_HEADERS)
        {
            String ip = request.getHeader(header);
            if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip))
            {
                String[] ips = ip.split(",");
                log.info("##### ip header: {}", header);
                return ips[0].trim();
            }
        }
        log.info("##### request.getRemoteAddr");
        return request.getRemoteAddr();
    }

2、注入方式获取

    @Autowired
    HttpServletRequest request;
    
    String[] IP_HEADERS = {"X-Forwarded-For", "X-Real-IP", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR"};
    
    @GetMapping({"/", "/index"})
    public String index()
    {
        return StringUtils.join("client ip: ", getClientIp(request));
    }
    
    /**
     * 获取客户端真实IP地址
     */
    private String getClientIp(HttpServletRequest request)
    {
        for (String header : IP_HEADERS)
        {
            String ip = request.getHeader(header);
            if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip))
            {
                // 处理多个IP的情况(逗号分隔)
                String[] ips = ip.split(",");
                log.info("##### ip header: {}", header);
                return ips[0].trim();
            }
        }
        log.info("##### request.getRemoteAddr");
        return request.getRemoteAddr();
    }

或者

    @Autowired
    HttpServletRequest request;
    
    String[] IP_HEADERS = {"X-Forwarded-For", "X-Real-IP", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR"};
    
    @GetMapping({"/", "/index"})
    public String index()
    {
        return StringUtils.join("client ip: ", getClientIp());
    }
    
    /**
     * 获取客户端真实IP地址
     */
    private String getClientIp()
    {
        for (String header : IP_HEADERS)
        {
            String ip = request.getHeader(header);
            if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip))
            {
                // 处理多个IP的情况(逗号分隔)
                String[] ips = ip.split(",");
                log.info("##### ip header: {}", header);
                return ips[0].trim();
            }
        }
        log.info("##### request.getRemoteAddr");
        return request.getRemoteAddr();
    }

3、隐式从上下文获取

    @GetMapping({"/", "/index"})
    public String index()
    {
        return StringUtils.join("client ip: ", getClientIp());
    }
    
    String[] IP_HEADERS = {"X-Forwarded-For", "X-Real-IP", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR"};
    
    /**
     * 获取客户端真实IP地址
     */
    private String getClientIp()
    {
        HttpServletRequest request = getHttpServletRequest();
        for (String header : IP_HEADERS)
        {
            String ip = request.getHeader(header);
            if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip))
            {
                // 处理多个IP的情况(逗号分隔)
                String[] ips = ip.split(",");
                log.info("##### ip header: {}", header);
                return ips[0].trim();
            }
        }
        log.info("##### request.getRemoteAddr");
        return request.getRemoteAddr();
    }
    
    private HttpServletRequest getHttpServletRequest()
    {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        if (servletRequestAttributes != null)
        {
            return servletRequestAttributes.getRequest();
        }
        return null;
    }

大家可以根据需要选择其中一种使用。

到此这篇关于Spring中获取HttpServletRequest的三种方式小结的文章就介绍到这了,更多相关Spring获取HttpServletRequest内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现每日给女友微信发送早安信息

    Java实现每日给女友微信发送早安信息

    这篇文章主要为大家详细介绍了Java如何实现每日给女友微信发送早安等微信信息,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2022-12-12
  • java通过ssh连接执行shell命令,文件传输方式

    java通过ssh连接执行shell命令,文件传输方式

    这篇文章主要介绍了java通过ssh连接执行shell命令,文件传输方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • SpringBoot整合log4j日志与HashMap的底层原理解析

    SpringBoot整合log4j日志与HashMap的底层原理解析

    这篇文章主要介绍了SpringBoot整合log4j日志与HashMap的底层原理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java代理模式与动态代理之间的关系以及概念

    Java代理模式与动态代理之间的关系以及概念

    代理模式是开发中常见的一种设计模式,使用代理模式可以很好的对程序进行横向扩展。动态代理:代理类在程序运行时被创建的代理方式。关键在于动态,程序具有了动态特性,可以在运行期间根据不同的目标对象生成动态代理对象
    2023-02-02
  • Java线程中的ThreadLocal详细分析

    Java线程中的ThreadLocal详细分析

    这篇文章主要介绍了Java线程中的ThreadLocal详细分析,ThreadLocal 提供线程的局部变量,每个线程都可以通过 get()和 set()对局部变量进行操作而不会对其他线程的局部变量产生影响,实现了线程之间的数据隔离,需要的朋友可以参考下
    2023-09-09
  • SpringCloud无法获取Nacos中的配置文件信息解决方案

    SpringCloud无法获取Nacos中的配置文件信息解决方案

    文章介绍了在项目启动时解决@Value占位符值找不到问题的步骤,包括检查版本号、添加依赖、检查配置文件优先级以及正确配置dataID
    2025-12-12
  • Java实现在Word中嵌入多媒体(视频、音频)文件

    Java实现在Word中嵌入多媒体(视频、音频)文件

    这篇文章主要介绍了Java如何实现在Word中嵌入多媒体(视频、音频)文件,文中的示例代码讲解详细,对我们学习java有一定的帮助,感兴趣的同学可以了解一下
    2021-12-12
  • Springboot使用RestTemplate调用第三方接口的操作代码

    Springboot使用RestTemplate调用第三方接口的操作代码

    这篇文章主要介绍了Springboot使用RestTemplate调用第三方接口,我只演示了最常使用的请求方式get、post的简单使用方法,当然RestTemplate的功能还有很多,感兴趣的朋友可以参考RestTemplate源码
    2022-12-12
  • 详解Java中的悲观锁与乐观锁

    详解Java中的悲观锁与乐观锁

    乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展.这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人,文中详细介绍了悲观锁与乐观锁,需要的朋友可以参考下
    2021-05-05
  • Spark SerializedLambda错误的两种解决方案

    Spark SerializedLambda错误的两种解决方案

    这篇文章主要介绍了Spark SerializedLambda错误的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论