我是否可以在我的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
时,其范围是请求?
Spring 3 MVC accessing HttpRequest from controller
How are Threads allocated to handle Servlet request?
Scope of a Spring-Controller and its instance-variables
How do I get a HttpServletRequest in my spring beans?
How To Get HTTP Request Header In Java
注意:我确实试过这个,似乎工作正常。但只是想确认即使在高度并发的环境中它也是一个万无一失的解决方案。 此外,如果这是正确的方法,我会很感激,如果有人能解释它是如何工作的。
答案 0 :(得分:2)
我已经使用过它并且工作正常。但不幸的是,我没有找到任何官方文件提到这应该有效。
以下是基于我的理解,通过运行具有不同标头/有效负载等的多个请求调试代码的解释:
无论我们是在字段上自动装配还是通过构造函数,servletRequest
都像Proxy对象一样,将对 Current HttpServletRequest 的调用委托给每个请求。因此,即使它通过构造函数在Singleton RestController 中注入,它仍然会将调用委托给每个新请求的相应HttpServletRequest。这利用AutowireUtils.ObjectFactoryDelegatingInvocationHandler来访问当前的HttpServletRequest对象。它的java文档还说 Reflective InvocationHandler,用于延迟访问当前目标对象 。
因此,即使所有请求的自动装配的Proxy对象始终相同,委托调用的基础目标对象也是每个请求的当前HttpServletRequest对象。
HttpServletRequest
RequestContextHolder
使用HttpServletRequest currentRequest =
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();
millis()
注意:由于此解释基于我的理解,如果有人拥有,请分享有关此内容的任何官方文档。