如何从JSESSIONID加载Java HttpSession?

Tus*_*rao 13 java servlets httpsession

我想HttpSession通过JSESSIONID 获取Java .可能吗?如果有,怎么样?

Bal*_*usC 30

你需要收集所有在MapHttpSessionListener你自己.

public class HttpSessionCollector implements HttpSessionListener {
    private static final Map<String, HttpSession> sessions = new HashMap<String, HttpSession>();

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        HttpSession session = event.getSession();
        sessions.put(session.getId(), session);
    }


    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        sessions.remove(event.getSession().getId());
    }

    public static HttpSession find(String sessionId) {
        return sessions.get(sessionId);
    }

}
Run Code Online (Sandbox Code Playgroud)

只需web.xml按如下方式注册即可运行它:

<listener>
    <listener-class>com.example.HttpSessionCollector</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

然后,您想要的任何地方都HttpSessionCollector.find(sessionId)可以解决HttpSession问题.


那说,这是一个巨大的气味.肯定有更好的方法来解决实际的功能需求;)正如我在你的后续问题中评论的那样:

这是你第二次问一个在现实世界中永远不应该实践的问题.老实说,这一切都闻起来.这是什么,您认为HttpSession 在服务器端获取与JSESSONID关联并在客户端获取JSESSIONID值的问题是"解决方案"?在一个新问题中详细说明这一点,你将得到正确方法的答案.

认真对待.我们不是在取笑你,我们只是试图帮助你朝着正确的方向,以避免你的项目/ webapp因安全漏洞和不良做法而破坏和/或你会被解雇.

  • @BalusC Servlet 规范实际上并没有说在它所属的请求线程之外使用 HttpSession 对象是有效的,所以你不应该坚持使用它们。最好只保留 sessionId 和您自己的一些数据在集合中。背景:一些容器重新创建或回收 HttpSession 对象,因此您无法同步它们,请参阅 http://stackoverflow.com/questions/9802165/is-synchronization-within-an-httpsession-feasible, https://forum .hibernate.org/viewtopic.php?f=7&amp;t=934936, https://forums.oracle.com/message/2973388 (2认同)