小编Ric*_*ard的帖子

球衣2:过滤器和@Context注入

我有以下问题:

ContainerRequestFilter是一个单例,但是请阅读以下内容:

Jaxrs-2_0 Oracle规格

在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

4
推荐指数
1
解决办法
2506
查看次数

标签 统计

jersey-2.0 ×1