2

我使用 ThreadLocal 来管理 HttpSession。代码如下:

public class HttpSessionLocal {

    private static ThreadLocal<HttpSession> threadLocal = new ThreadLocal<HttpSession>();

    public static HttpSession getSession(HttpServletRequest request) {
        HttpSession session = threadLocal.get();
        if (session == null) {
            threadLocal.set(request.getSession());
        }
        return threadLocal.get();
    }

    public static void setSession(HttpSession session) {
        threadLocal.set(session);
    }

}


public class SessionListener implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
    }

    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        HttpSessionLocal.setSession(null);
    }
}

我们可以这样做吗?如果没有,我们如何改进它?谢谢!

4

2 回答 2

0

您的代码将无法按预期工作,因为 http 请求线程与容器产生的用于处理sessionDestroyed事件的线程不同。

我无法想象为什么您将 http 会话保留在本地线程中并需要HttpServletRequestas 参数HttpSessionLocal.getSession。如果您有参考,request您可以通过以下方式获得 http 会话:request.getSession()

于 2013-05-25T08:52:08.497 回答
0

这没有道理。HttpServletRequest.getSession()为同一会话中的所有请求返回相同的HttpSession对象。你不需要缓存它。此外,HttpSession不受线程限制,同一会话中的请求可能来自不同的线程。

于 2013-05-25T08:49:32.237 回答