SpringBoot获取HttpServletRequest的3种方式总结

 更新时间:2023年08月10日 09:33:42   作者:太空眼睛  
这篇文章主要给大家介绍了关于SpringBoot获取HttpServletRequest的3种方式,在Spring boot项目中经常要用到Servlet的常用对象如HttpServletRequest request,HttpServletResponse response,HttpSession session,需要的朋友可以参考下

方法一: Controller中增加request参数

@RestController
public class DemoController { 
    @RequestMapping("/demo")
    public void demo(HttpServletRequest request) {        
        System.out.println(request.getParameter("hello"));
    }
}
  • 线程安全
  • 缺点: 每个方法都需要写一遍

方法二: 自动注入

@Slf4j
@RequestMapping(path = "/request")
@RestController
public class DemoRequestController {
    @Resource
    private HttpServletRequest request1;
    @RequestMapping(path = "/demo")
    public String demo(HttpServletRequest request2) {
        log.info("request1: {}", request1.getClass());
        log.info("request2: {}", request2.getClass());
        return "Hello, world!";
    }
}
  • 线程安全
  • Spring中,DemoRequestControllerscopesingleton(单例),也就是说在整个web系统中,只有一个DemoRequestController;但是其中注入的request却是线程安全的,原因在于:使用这种方式,当Bean(本例的DemoRequestController)初始化时,Spring并没有注入一个request对象,而是注入了一个代理(proxy);当Bean中需要使用request对象时,通过该代理获取request对象。
  • 代理对象中用到了 ThreadLocal , 因此request对象也是线程局部变量;这就保证了request对象的线程安全性。
  • 不限于Controller中,可以在任何地方进行注入
  • 注入的对象不限于request:除了注入request对象,该方法还可以注入其他scoperequestsession的对象,如HttpServletResponse对象、HttpSession对象等;并保证线程安全
  • 如果Controller有很多,那么我们需要在每个Controller里面进行注入

方法三: 基类中自动注入

本质与方法二类似

public class BaseController {   
   @Autowired 
   protected HttpServletRequest request;
}
  • 线程安全
  • 与方法2相比,避免了在不同的Controller中重复注入request
  • 但是java只允许继承一个基类

方法四: 手动调用

@Slf4j
@RequestMapping(path = "/request")
@RestController
public class DemoRequestController {
    @Resource
    private HttpServletRequest request1;
    @RequestMapping(path = "/demo")
    public String demo(HttpServletRequest request2) {
        HttpServletRequest request3 = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
        log.info("request1: {}", request1.getClass());
        log.info("request2: {}", request2.getClass());
        log.info("request3: {}", request3.getClass());
        return "Hello, world!";
    }
}
  • 线程安全
  • 可以在非Bean中直接获得
  • 缺点与方法一类似

总结

获取HttpServletRequest共有三种方式

  • Controller的方法增加HttpServletRequest参数
  • 自动注入

建议使用继承来减少代码冗余

  • 通过RequestContextHolder.currentRequestAttributes()手动获取

适合在非Bean中获取

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

相关文章

  • PowerJob的DesignateServer工作流程源码解读

    PowerJob的DesignateServer工作流程源码解读

    这篇文章主要介绍了PowerJob的DesignateServer工作流程源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • java Map接口子类HashMap遍历与LinkedHashMap详解

    java Map接口子类HashMap遍历与LinkedHashMap详解

    这篇文章主要介绍了java Map接口子类HashMap遍历与LinkedHashMap详解,Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,感兴趣的小伙伴可以参考下面文章详细内容介绍
    2022-06-06
  • OpenFeign指定url方式调用的方式详解

    OpenFeign指定url方式调用的方式详解

    OpenFeign一般是结合注册中心一起使用的,也就是可以通过提供服务的名称而不是url来完成对目标服务的访问,本篇我们就讲解一下OpenFeign直接通过目标服务的url进行调用的方式,需要的朋友可以参考下
    2024-11-11
  • MybatisGenerator文件生成不出对应文件的问题

    MybatisGenerator文件生成不出对应文件的问题

    本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成器的路径等,通过在项目结构中引入相应的jar包,并在GeneratorSqlmap.java文件中运行,可以成功生成对应的文件
    2025-01-01
  • 使用Java的Graphics类进行绘图的方法详解

    使用Java的Graphics类进行绘图的方法详解

    这篇文章主要介绍了使用Java的Graphics类进行绘图的方法,是Java的GUI编程的基础,需要的朋友可以参考下
    2015-10-10
  • Spring使用@responseBody与序列化详解

    Spring使用@responseBody与序列化详解

    这篇文章主要介绍了Spring使用@responseBody与序列化详解,@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要的朋友可以参考下
    2023-08-08
  • Java语言实现简单FTP软件 FTP上传下载管理模块实现(11)

    Java语言实现简单FTP软件 FTP上传下载管理模块实现(11)

    这篇文章主要为大家详细介绍了Java语言实现简单FTP软件,FTP本地文件管理模块的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java中的逻辑结构详解

    Java中的逻辑结构详解

    这篇文章主要介绍了Java中的逻辑结构详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 详解Java多线程和IO流的应用

    详解Java多线程和IO流的应用

    这篇文章主要介绍了详解Java多线程和IO流的应用,无论是本地文件复制,还是网络多线程下载,对于流的使用都是一样的,需要的朋友可以参考下
    2023-04-04
  • springboot2如何禁用自带tomcat的session功能

    springboot2如何禁用自带tomcat的session功能

    这篇文章主要介绍了springboot2如何禁用自带tomcat的session功能,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论