JerseyConportResponseFilter中的@Context HttpServletRequest范围

时间:2013-08-20 02:59:12

标签: multithreading concurrency 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");
....
}
}

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:7)

第9.1节(最新的,5.1以前的)JAX-RS specification状态的并发:

  

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

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

另请参阅:Extract request attributes from container request of Jersey