Java 我应该在哪里存储我想通过tomcat REST ws访问的变量?

Java 我应该在哪里存储我想通过tomcat REST ws访问的变量?,java,web-services,rest,tomcat,jersey,Java,Web Services,Rest,Tomcat,Jersey,我使用Jersey 1.18在Tomcat版本7中运行REST Web服务。传入的每个请求都有一个名为“请求id”的自定义头。我希望将此请求id存储在某个地方,以便所有类都可以访问此请求id,并可以将其用于日志记录 最重要的是,这必须基于每个请求。请求A的请求id与请求B的请求id不同 在哪里可以存储这样的变量?某种基于每个请求的有效上下文-有人能为我指出正确的方向吗?您可以将其存储在。但是你必须小心。您需要在收到请求时存储它,并在返回响应时清除它。您可能希望编写静态实用程序方法来存储和检索请求

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

最重要的是,这必须基于每个请求。请求A的请求id与请求B的请求id不同

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

您可以将其存储在。但是你必须小心。您需要在收到请求时存储它,并在返回响应时清除它。您可能希望编写静态实用程序方法来存储和检索请求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();
    }



}
公共类RequestIdUtil{
private static final ThreadLocal requestIdHolder=new ThreadLocal();
私有RequestIdUtil(){
//防止初始化
}
公共静态void setRequestId(字符串requestId){
requestIdHolder.set(requestId);
}
/**
* 
*@returnrequestid
*         
*/
公共静态字符串getRequestId(){
return requestIdHolder.get();
}
公共静态void remove(){
requestIdHolder.remove();
}
}

在本例中,即使引发异常,也需要在每个请求的处理结束时调用remove

它可能属于请求范围(参见JEE文档),感谢您的响应。我曾期待/希望有一种简单得多的方法来做这件事。我不能掌握一些会话上下文或其他内容,然后添加所有这些变量吗?我能否实现ServletContextListener或ServletRequestListener并添加属性?这样行吗?对于新手提出的问题,很抱歉。您不希望您的业务/DAO逻辑知道请求/servlet/etc。。。看一看类似的问题:您还可以使用AuthenticationFilter来提供SecurityContext,它在任何地方都可以访问。看一看。然而,如果你只有一个id,那就有点奇怪了。