【问题标题】:Where should I store a variable that I want to access thru out my tomcat REST ws?我应该在哪里存储我想通过我的 tomcat REST ws 访问的变量?
【发布时间】:2014-07-19 12:20:07
【问题描述】:

我有一个使用 Jersey 1.18 在 Tomcat 版本 7 中运行的 REST Web 服务。每个传入的请求都有一个名为“request-id”的自定义标头。我想将此请求 ID 存储在某个位置,以便所有类都可以访问此请求 ID 并可以将其用于日志记录。

主要的是,这必须基于每个请求。请求 A 的请求 ID 与请求 B 的不同。

我在哪里可以存储这样的变量?某种基于每个请求都有效的上下文 - 有人能指出我正确的方向吗?

【问题讨论】:

  • 它可能属于请求范围(参见 JEE 文档)

标签: java web-services rest tomcat jersey


【解决方案1】:

您可以将其存储在ThreadLocal。但是你必须小心。您需要在收到请求时将其存储,并在返回响应时将其清除。您可能希望编写静态实用程序方法来存储和检索请求 id,如下所示:

public class RequestIdUtil {

    private static final ThreadLocal<String> requestIdHolder = new ThreadLocal<String>();

    private RequestIdUtil() {
        // to prevent initialization
    }

    public static void setRequestId(String requestId) {
        requestIdHolder.set(requestId);
    }

    /**
     * 
     * @return requestId
     *         
     */
    public static String getRequestId() {
        return requestIdHolder.get();
    }

    public static void remove() {
        requestIdHolder.remove();
    }



}

在此示例中,即使抛出异常,也需要在每个请求的处理结束时调用 remove。

【讨论】:

  • 感谢您的回复。我曾期望/希望有一种更简单的方法来做到这一点。我不能掌握一些会话上下文或其他东西并添加所有这些变量吗?我不能实现 ServletContextListener 或 ServletRequestListener 并添加一个属性吗?那行得通吗?对新手问题感到抱歉。
  • 您不希望您的业务/DAO 逻辑知道请求/servlets/etc... 看看类似的问题:stackoverflow.com/questions/19790026/…
  • 您还可以使用 AuthenticationFilter 来提供 SecurityContext,它在任何地方都可以访问。看看stackoverflow.com/questions/23231511。但是,如果你只有一个 id,那就有点奇怪了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 2014-11-10
  • 2012-03-22
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多