我正在写一个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");
....
}
}
答案 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