gpt4 book ai didi

jersey-2.0 - Jersey 2 : filters and @Context injections

转载 作者:行者123 更新时间:2023-12-05 00:58:02 24 4
gpt4 key购买 nike

我有以下问题:

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

Jaxrs-2_0 Oracle Spec

在第 9.2 章中,他们说:

Context is specific to a particular request but instances of certain JAX-RS components (providers and resource classes with a lifecycle other than per-request) may need to support multiple concurrent requests. When injecting an instance of one of the types listed in Section 9.2, the instance supplied MUST be capable of selecting the correct context for a particular request. Use of a thread-local proxy is a common way to achieve this.



在第 9.2 章中,没有提到 HttpServletRequest。

所以问题是:在并发方面将 HttpServletRequest 注入(inject)自定义 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);

[...]
}

我在 Debug模式下对我的 IDE 进行了一些实证测试,使用两个不同的浏览器发送两个不同的并发请求,它似乎运行良好;我注意到过滤器的实例是相同的(它是一个单例),但是在这两种情况下注入(inject)的 HttpServletRequest 是不同的。

我什至读过这个帖子: How to access wicket session from Jersey-2 request filter?看来我的测试得到了证实。

但我仍然有疑问。

确认?

最佳答案

是的,它是安全的。要理解这个问题,你应该了解作用域是如何工作的。在任何处理范围(和注入(inject))的框架中,该功能的实现方式类似。如果一个对象在单例范围内并且需要注入(inject)较小范围内的另一个对象,通常会注入(inject)该对象的代理。当对对象进行调用时,实际上是对代理的调用。

虽然规范可能没有提到 HttpServletRequest具体来说,大多数 JAX-RS 实现都支持这一点。特别是对于 Jersey,如果这是不可能的(意味着对象不可代理),那么您将在启动时收到一条错误消息,例如“不在请求范围内”。原因是 ContainerRequestFilter是在应用程序启动时创建的,所有的注入(inject)也是在那个时候处理的。如果 HttpServletRequest不可代理,它将无法注入(inject),因为在启动时,没有请求范围上下文。

确认它不是实际的HttpServletRequest并且是代理,您可以登录request.getClass() ,你会发现它确实是一个代理。

如果你对这个模式不熟悉,可以看this answer了解它是如何工作的。

另见:

  • Injecting Request Scoped Objects into Singleton Scoped Object with HK2 and Jersey
  • 关于jersey-2.0 - Jersey 2 : filters and @Context injections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33632538/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com