【SpringBoot】获取HttpServletRequest的三种方式

方法一: 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中获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太空眼睛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值