JerseyConportResponseFilter中的@Context HttpServletRequest范围

lor*_*cel 8 concurrency multithreading jersey

我正在写一个Jersey Response过滤器.我正在使用Jersey 1.17.我想在过滤器API中访问httpServletRequest的一些属性.我现在正在做的方式如下.在下面的代码片段中注入servletRequest是否安全,否则会导致某种并发问题?如果有多个请求同时进入,那么不同请求中的servletRequest是否会相互覆盖?谢谢你的hlep.

public class LoggingFilter implements ContainerResponseFilter {
@Context private HttpServletRequest servletRequest;
@Override
public ContainerResponse filter(final ContainerRequest req, final ContainerResponse resp) {
String s =  this.servletRequest.getAttribute("xxx");
....
}
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*dos 7

你安全了.当你注入HttpServletRequest/ HttpServletResponse你没有处理特定的实例,而是使用代理时,通过该代理调用存储在ThreadLocal对象中的实际实例.每个请求都由一个单独的线程处理,该线程可以访问它自己的HttpServletRequest/ HttpServletResponse.除了注入HttpServletRequest/ HttpServletResponse你还可以注入ThreadLocal<HttpServletRequest>/ ThreadLocal<HttpServletResponse>并通过'#get()`方法,你可以获得代理的实际请求/响应实例.


Dan*_*yMo 7

9.1节(最新的,5.1以前的)JAX-RS规范的并发性说明:

上下文特定于特定请求,但某些JAX-RS组件(具有除每个请求之外的生命周期的提供程序和资源类)的实例可能需要支持多个并发请求.当注入第9.2节中列出的类型之一的实例时,提供的实例必须能够为特定请求选择正确的上下文.使用线程本地代理是实现此目的的常用方法.

因此,根据规范,JAX-RS实现(例如Jersey)需要确保上下文是安全的.继续做你正在做的事情.

另请参阅:从Jersey的容器请求中提取请求属性