Jersey 2:过滤器和@Context注入

2024-03-26

我有以下问题:

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

Jaxrs-2_0 Oracle 规范 http://download.oracle.com/otn-pub/jcp/jaxrs-2_0-fr-eval-spec/jsr339-jaxrs-2.0-final-spec.pdf?AuthParam=1447161642_e58ff98fc793e6bf6ef01aab8e594b20

在第 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);

    [...]
}

我在调试模式下在 IDE 上做了一些实证测试,使用两个不同的浏览器发送两个不同的并发请求,看起来效果很好;我注意到过滤器的实例是相同的(它是一个单例),但是注入的 HttpServletRequest 在这两种情况下是不同的。

我什至读过这个帖子:如何从 Jersey-2 请求过滤器访问 wicket 会话? https://stackoverflow.com/questions/19103853/how-to-access-wicket-session-from-jersey-2-request-filter看来我的测试得到了证实。

但我还是有疑问。

Confirm?


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

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

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

如果你不熟悉这个模式,你可以看看这个答案 https://stackoverflow.com/a/32937172/2587435了解它是如何工作的。

也可以看看:

  • 使用 HK2 和 Jersey 将请求范围对象注入单例范围对象 http://paulsamsotha.blogspot.com/2015/12/injecting-request-scoped-objects-into.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jersey 2:过滤器和@Context注入 的相关文章

随机推荐

  • Android 中的 ImageView 内容是否有工具属性?

    我找不到tools属性以在 Android 布局中设置示例图像 我的假设是目前没有这样的事情 至少没有direct支持 但我想知道是否我搜索得不够好或者是否有解决方法 如何在 Android 设计时定义图像占位符tools 的例子tools
  • 使用 barsince(change(strategy.position_size)) > 10 时输入不起作用

    我的脚本中有一个奇怪的问题 这是工作代码 version 4 strategy Test script overlay true pyramiding 100 process orders on close true FACTOR 1X M
  • 使用 jQuery 检索和修改 :before 元素

    我想选择一个由 CSS 选择器创建的元素 before 我尝试使用 element before 但这不起作用 因为它选择了整个元素 而不仅仅是 before元素 这是示例代码 DEMO http jsfiddle net qGStB 在该
  • 无法在 Mac 上的 Genymotion 模拟器上运行 telnet 命令

    我在 Mac OS X Yosemite 上运行 Genymotion 2 3 1 当我在 Win 7 上运行 Genymotion 时 我可以远程登录到模拟器并运行 geo fix 等命令来设置位置 但是 在 Yosemite 上 当我远
  • 在 Excel 中单击时,超链接从 # 更改为 %20-%20 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Excel 2013 工作表中有一个链接到内部网站的超链接 当我右键单击并选择 编辑超链接 时 我在地址栏中看到以下内容 这是正确的
  • 饥饿与upgrade_lock

    我正在尝试使用Boostupgrade lock using 这个例子 https stackoverflow com questions 989795 example for boost shared mutex multiple rea
  • 在 Angular 2 中使用 Sass

    我正在尝试设置Sass in my Angular 2项目 基本上据我了解 有两种方法可以创建 Angular 2 项目 1 使用angular cli https github com angular angular cli https
  • 用 pandas 计算指数移动平均线

    我尝试用 pandas 计算 ema 但结果不好 我尝试了两种技术来计算 第一个技术是panda的函数ewn window 100 c 2 float window 1 df 100ema df close ewm com c mean 但
  • 如何制作Maven项目的“胖罐子”? [复制]

    这个问题在这里已经有答案了 使用 IntelliJ 我刚刚创建了一个新的 Maven 项目并将以下内容添加到 pom 文件中http undertow io downloads html http undertow io downloads
  • 我应该在 FluentValidation 中创建一个新的集合类型吗?

    我试图找到 FluentValidation 中是否有可用的方法 允许在根级别验证集合的验证器 例如如下所示 验证器可用于CustomerValidator为一堂课Customer 使用 FluentValidation public cl
  • 使用配置文件并行执行 FirefoxDriver 测试共享相同的配置文件副本

    一段时间以来 我们一直在使用 FirefoxDriver 执行一组基于 WebDriver 2 25 0 的自动化测试 测试由基于 Maven 3 0 的构建及其 FailSafe 插件并行执行 四核机器上每个核心 2 个线程 每个测试都有
  • 获取标签内的所有节点

    我有这样的代码 div Lorem ipsum dolor sit amet p This is a paragraph p br span This is a span span Lorem ipsum dolor sit amet di
  • 当应用程序处于信息亭模式时拨打电话

    我们正在开发一款 Android 应用程序 旨在取代默认的 Android 拨号器并自行处理设备中正在进行的所有呼叫 到目前为止 该应用程序按预期工作 我们可以通过启动来处理来电和拨打电话ACTION CALL意图 但是 此应用程序旨在通过
  • JQuery 从提交函数内部提交表单

    以下是我想在 JQuery 脚本中执行的操作 在下面的提交函数 第 4 个 中 我想确定表单是否有文件输入并使用 ajax 提交 或者只是不使用 ajax 的常规表单提交 换句话说 如果表单已上传 则进行常规提交 我在下面的提交功能中写了这
  • 从 JSON 对象中删除键值对

    我下面有这个 JSON 对象 XXX 2 YYY 3 ZZZ 4 XXX 5 YYY 6 ZZZ 7 XXX 1 YYY 2 ZZZ 3 我想从 json 对象中删除 YYY 键值 以便新的 json 对象如下所示 XXX 2 ZZZ 4
  • 如何解决违反迪米特法则的问题?

    我和一位同事为我们的客户设计了一个系统 我们认为我们创建了一个漂亮简洁的设计 但我对我们引入的一些耦合遇到了问题 我可以尝试创建一个示例设计 其中包含与我们的设计相同的问题 但如果您原谅我 我将创建我们设计的摘录来支持该问题 我们正在开发一
  • 如何在 React 中触发函数之前等待 setState 完成?

    这是我的情况 在 this handleFormSubmit 上我正在执行 this setState 在 this handleFormSubmit 内部 我调用 this findRoutes 这取决于 this setState 的成
  • 找不到使用 System.Web.UI.HtmlControls 命名空间

    我尝试了各种使用方法System Web UI HtmlControls 但我没有找到任何参考 我如何使用该命名空间 转到项目的参考文献并确保 System Web 位于其中 如果没有 右键单击 添加引用 NET 然后添加 System W
  • Sublime Text 2 插件可按字母顺序对函数进行排序

    我正在我的应用程序中构建许多函数 现在我想按字母顺序排列它们 Sublime Text 2 中是否有任何函数可以自动执行此操作 应该改变这些 public function login 1 public function about pub
  • Jersey 2:过滤器和@Context注入

    我有以下问题 ContainerRequestFilter 是一个单例 但是阅读以下内容 Jaxrs 2 0 Oracle 规范 http download oracle com otn pub jcp jaxrs 2 0 fr eval