SpringBoot获取HttpServletRequest的3种方式总结
作者:太空眼睛
这篇文章主要给大家介绍了关于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集成WebServlet出现自定义servlet请求失败的问题解决方案
- SpringBoot里使用Servlet进行请求的实现示例
- springboot扫描自定义的servlet和filter代码详解
- Springboot注入成员变量HttpServletRequest的原理分析
- SpringBoot3.1.2 引入Swagger报错Type javax.servlet.http.HttpServletRequest not present解决办法
- 解决IDEA启动springboot项目报错java.lang.ClassNotFoundException: javax.servlet.ServletContext
- Springboot如何添加server.servlet.context-path相关使用
- SpringBoot项目找不到javax.servlet.Filter的问题及解决
- SpringBoot如何切换成其它的嵌入式Servlet容器(Jetty和Undertow)
