我有以下问题:
ContainerRequestFilter是一个单例,但是请阅读以下内容:
在9.2章中,他们说:
上下文是特定于特定请求的,但是某些JAX-RS组件(具有不同于每个请求的生命周期的提供程序和资源类)的实例可能需要支持多个并发请求。当注入第9.2节中列出的一种类型的实例时,提供的实例必须能够为特定请求选择正确的上下文。使用线程本地代理是实现此目的的常用方法。
在9.2章中,没有提到HttpServletRequest。
所以问题是:在并发方面将HttpServletRequest注入自定义的ContainRequestFilter内是否安全?
我的意思是:
@Provider
@PreMatching
public class AuthenticationFilter implements ContainerRequestFilter {
@Context private HttpServletRequest request;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
// This is safe because every thread call the method with its requestContext
String path = requestContext.getUriInfo().getPath(true);
// Is this safe? The property request is injected by using @Context annotation (see above)
String toReturn = (String)request.getAttribute(name);
[...]
}
Run Code Online (Sandbox Code Playgroud)
我在IDE的调试模式下进行了一些实证测试,使用两个不同的浏览器发送了两个不同的并发请求,它似乎运行良好。我注意到过滤器的实例是相同的(单例),但是在两种情况下注入的HttpServletRequest是不同的。
我什至阅读了以下主题:如何从Jersey-2请求过滤器访问检票口会话?而且似乎我的测试已得到确认。
但是我仍然有疑问。
确认?
jersey-2.0 ×1