【问题标题】:How can i load Java HttpSession from JSESSIONID?如何从 JSESSIONID 加载 Java HttpSession?
【发布时间】:2011-03-06 18:17:39
【问题描述】:

我想通过 JSESSIONID 获取 Java HttpSession。可能吗?如果是,怎么做?

【问题讨论】:

    标签: java servlets httpsession


    【解决方案1】:

    您需要自己使用HttpSessionListener 将它们全部收集在Map 中。

    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);
        }
    
    }
    

    只需在web.xml注册如下即可运行:

    <listener>
        <listener-class>com.example.HttpSessionCollector</listener-class>
    </listener>
    

    然后,您可以在任何地方执行 HttpSessionCollector.find(sessionId) 以获取相关的 HttpSession


    也就是说,这是一种巨大的气味。当然有比这更好的方法来解决实际功能要求;)正如我在你的follow-up question中评论的那样:

    这是您第二次提出在现实世界中永远不应该练习的问题。老实说,这一切都闻起来了。它是什么,您认为在服务器端获取与 JESSSONID 关联的 HttpSession 并在客户端获取 JSESSIONID 值的问题是“解决方案”?在一个新问题中详细说明这一点,您将获得如何以正确方式进行操作的答案。

    认真点。我们不是在取笑您,我们只是想帮助您朝着正确的方向前进,以避免您的项目/Web 应用程序由于安全漏洞和不良做法而中断和/或您被解雇。

    【讨论】:

    • 也许我可以解释为什么我发现自己问了同样的问题,你可以解释为什么这不是我想要的:我假设我的服务器应该在 HTTPSession 中存储详细信息,并返回它的 sessionID (HttpSession.getId()) 到客户端,因此客户端可以将其存储在 cookie 中。然后客户端可以在几天后将 cookie 提供给服务器,以再次使用相同的会话。但这需要服务器能够根据该会话 ID 检索 HTTPSession,和/或以某种方式使其成为活动会话。但我仍在探索整个想法。 (我正在使用 GWT。)
    • @murrayc:默认情况下,会话在 30 分钟不活动后超时。另见stackoverflow.com/questions/3106452/…stackoverflow.com/questions/2185951/…
    • 啊,我现在明白 HTTPSession(或它在 Tomcat 中的实现,或其他东西)会自动设置 JSESSIONID cookie,然后(但在用户关闭浏览器之前)确保 HTTPSession 具有来自 cookie 的 JSESSIONID。所以我不需要这样做。我现在也明白我不想使用常规的 JSESSIONID cookie 来跨浏览器会话保持登录,因为 a) 这不是它的用途和 b) 这不会有效。所以我会使用一个单独的cookie。
    • @BalusC Servlet 规范实际上并没有说在它所属的请求线程之外使用 HttpSession 对象是有效的,所以你不应该坚持下去。最好只保留 sessionId 以及您自己的一些数据在集合中。背景:某些容器会重新创建或回收 HttpSession 对象,因此您无法对其进行同步,请参阅stackoverflow.com/questions/9802165/…forum.hibernate.org/viewtopic.php?f=7&t=934936forums.oracle.com/message/2973388
    【解决方案2】:

    您可以按照 BalusC 的回答执行此操作,但这种设施的存在是不同用户之间的表面上安全漏洞。你不应该在你的应用程序中构建这样的东西。

    【讨论】:

      【解决方案3】:

      不,API 不允许这样做。

      我想说的更多,但仅此而已。

      【讨论】:

      • 是的,API 确实允许这样做,而这就是
      猜你喜欢
      • 2010-12-02
      • 2016-07-17
      • 2011-07-05
      • 2012-09-22
      • 2018-05-25
      • 1970-01-01
      • 2011-08-11
      • 2019-08-13
      相关资源
      最近更新 更多