【问题标题】:How to obtain an HttpSession Object from SessionID?如何从 SessionID 中获取 HttpSession 对象?
【发布时间】:2010-11-18 02:10:37
【问题描述】:

我想根据某些事件使用户会话无效。我存储了他们的 sessionID,如何从这个 ID 中获取他们的 HttpSession? HttpSessionContext 类已被弃用,没有替代品。

【问题讨论】:

    标签: java servlets httpsession


    【解决方案1】:

    已弃用已执行此操作的方法。 但是您可以使用 HttpSessionListener 实现您的想法,当创建新会话时,将其存储在 HashMap 中,会话 id 作为键,对象是实际的 HttpSessionObject。你可以通过这个获得参考。

    【讨论】:

    • 是的,我能做到。但我正在为一个拥有数百万用户的大型网站编写应用程序。将这些 id/session 存储在地图中是不明智的。我需要从容器本身获取会话,容器更了解如何存储它们。
    • 存储对象意味着您不会存储实际对象。只有引用被存储。所以存储空间将是最小的。
    • 我明白了。但是如果容器将不常用的会话序列化到数据库/文件系统怎么办?我不知道 WebLogic 如何处理这些会话。如果我找不到直接从容器中检索会话的直接方法,我将使用此解决方案作为最后一个解决方案。
    • 好的 如果你想保持会话对象是持久性的,那么我建议在数据库中保持相同的键(sessionID)、值(httpsession)。在这种情况下使用 Berkeley DB 是正确的选择。
    • 如果您使用这种方法,您需要确保 Map 中的条目不会永远存在 - 否则这可能会导致意外的内存泄漏/GC 问题。可能使用 Wea​​kMap 或 WeakReference
    【解决方案2】:

    出于安全原因,Servlet 2.2 专门弃用了此功能,因此不应该有任何官方方式来执行此操作。不推荐,但如果您使用 Tomcat,可以尝试使用 Manager.findSession()。

    我刚刚从我的应用程序中删除了 HttpSession。当许多服务器正在运行时,很难保持会话同步。我们试图通过编写我们自己的经理来调整它,但永远无法让它正常工作。最后,我们用大约 500 行代码编写了自己的会话实现,并且效果更好。

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      相关资源
      最近更新 更多