Spring MVC-我可以在RestController中自动装配HttpServletRequest吗


问题内容

我可以按照以下方式自动接线吗HttpServletRequest,即使它在高度并发的环境中执行,它RestController也会返回不同的结果吗servletRequest?我有一个限制,我不能将其作为方法参数,因为我实现的是一个自动生成的接口,而不会HttpServletRequest作为方法参数。

@RestController
public class MyController implements MyInterface {

    @Autowired
    private HttpServletRequest servletRequest;

    @Override
    @RequestMapping(value = "/test", produces = {"application/json"}, consumes = {"application/json"}, method = RequestMethod.POST)
    public ResponseEntity<MyResponse> test(@RequestBody final MyRequest payload){
        ...
    }
    ...
}

我经历了这些SO问题以及与此相关的其他文章。但是只是想确保当我们HttpServletRequest在控制器中自动接线时,其 范围 是_Request_ ?

如何在Java中获取HTTP请求标头


注意:
我确实尝试过此方法,但似乎工作正常。但是只是想确认一下,即使在高度并发的环境中,这也是一个万无一失的解决方案。同样,如果这是正确的方法,那么如果有人可以解释它是如何工作的,我将不胜感激。


问题答案:

我已经用过了,效果很好。但不幸的是,我没有找到任何官方文件提及此功能。

这是基于我的理解的解释,我的理解是通过运行具有不同标头/有效负载等的多个请求来调试代码:

无论是现场自动装配还是通过构造函数自动装配,servletRequest都像Proxy对象一样,将调用委派给 Current
HttpServletRequest
,每个请求均不同。因此,即使通过构造函数将其注入到Singleton RestController中
,它仍将为每个新请求将调用委派给相应的HttpServletRequest。这利用AutowireUtils.ObjectFactoryDe​​legatingInvocationHandler访问当前的HttpServletRequest对象。它的Java文档还说
Reflective InvocationHandler可以延迟访问 当前目标对象

因此,即使自动连接的Proxy对象对于所有请求始终都是相同的,将调用委派给其的基础目标对象是每个请求的当前HttpServletRequest对象。


HttpServletRequest currentRequest = 
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();

注意: 由于此说明是基于我的理解,因此,如果有人知道,请共享任何官方文档。