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
中,DemoRequestController
的scope
是singleton
(单例),也就是说在整个web
系统中,只有一个DemoRequestController
;但是其中注入的request
却是线程安全的,原因在于:使用这种方式,当Bean
(本例的DemoRequestController
)初始化时,Spring
并没有注入一个request
对象,而是注入了一个代理(proxy
);当Bean
中需要使用request
对象时,通过该代理获取request
对象。 - 代理对象中用到了
ThreadLocal
, 因此request对象也是线程局部变量;这就保证了request
对象的线程安全性。 - 不限于
Controller
中,可以在任何地方进行注入 - 注入的对象不限于
request
:除了注入request
对象,该方法还可以注入其他scope
为request
或session
的对象,如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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot整合kafka遇到的版本不对应问题及解决
这篇文章主要介绍了SpringBoot整合kafka遇到的版本不对应问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-03-03Spring中的@ConditionalOnProperty注解使用详解
这篇文章主要介绍了Spring中的@ConditionalOnProperty注解使用详解,在 spring boot 中有时候需要控制配置类是否生效,可以使用 @ConditionalOnProperty 注解来控制 @Configuration 是否生效,需要的朋友可以参考下2024-01-01SpringBoot使用SensitiveWord实现敏感词过滤
这篇文章主要为大家详细介绍了SpringBoot如何使用SensitiveWord实现敏感词过滤功能,文中示例代码讲解详细,感兴趣的小伙伴可以了解一下2023-01-01spring cache注解@Cacheable缓存穿透详解
这篇文章主要介绍了spring cache注解@Cacheable缓存穿透详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12SpringBoot使用@Async注解可能会遇到的8大坑点汇总
SpringBoot中,@Async注解可以实现异步线程调用,用法简单,体验舒适,但是你一定碰到过异步调用不生效的情况,今天,我就列出90%的人都可能会遇到的8大坑点,需要的朋友可以参考下2023-09-09
最新评论