【问题标题】:@Context HttpServletRequest scope in Jersey ContainerResponseFilterJersey ContainerResponseFilter 中的@Context HttpServletRequest 范围
【发布时间】:2013-08-20 02:59:12
【问题描述】:

我正在编写 Jersey Response 过滤器。我正在使用泽西岛 1.17。我想在过滤器 API 中访问 httpServletRequest 的某些属性。我现在正在做的事情如下。像下面的 sn-p 那样注入 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");
....
}
}

【问题讨论】:

    标签: multithreading concurrency jersey


    【解决方案1】:

    第 9.1 节(最新的,以前的 5.1)JAX-RS specification 状态的并发:

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

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

    另见:Extract request attributes from container request of Jersey

    【讨论】:

    • 非常感谢。我没想到人们会这么快回答我的问题。这真的让我很惊讶并解决了问题。
    【解决方案2】:

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

    【讨论】:

    • 谢谢米哈尔。其实我没想到人们会这么快回答我的问题。这真的让我很惊讶并解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2017-01-26
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多