9

我正在写一个 Jersey Response 过滤器。我正在使用泽西岛 1.17。我想在过滤器 API 中访问 httpServletRequest 的某些属性。我现在正在做的事情如下。像下面的代码片段那样注入 servletRequest 是否安全,或者这会导致某种并发问题?如果同时有多个请求进来,不同请求中的servletRequest会互相覆盖吗?谢谢你的帮助。

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");
....
}
}
4

2 回答 2

8

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

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

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

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

于 2013-08-20T14:34:36.733 回答
7

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

于 2013-08-20T09:21:18.967 回答