【发布时间】:2010-01-15 03:41:51
【问题描述】:
管理会话数量和消除不需要的会话有哪些策略?
或者
我如何知道不再需要会话?
【问题讨论】:
管理会话数量和消除不需要的会话有哪些策略?
或者
我如何知道不再需要会话?
【问题讨论】:
servlet 容器通常会使超时的会话失效并擦除。你真的完全不需要担心它。但是,您可以在web.xml 中配置会话超时,如下所示:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
值以分钟为单位,默认值为 30 分钟。这意味着当客户端长时间没有请求与会话关联的页面时,会话将失效。
如果您想限制同时打开的会话数,则需要实现HttpSessionListener 并分别对sessionCreated() 和sessionDestroyed() 执行递增/递减。如果出于某些模糊的原因还想跟踪实际的 HttpSession 引用,请确保将它们存储在 WeakHashMap 中,以便在服务器内存中失效/取消引用时自动删除它们,否则会污染和溢出服务器内存。
再一次,您不必担心维护会话。让 Web 容器完成它的任务,它就是为它设计的。
【讨论】:
你为什么要自己做这件事?您的 Web 服务器或容器应自动处理此问题,无需您的干预。
【讨论】:
在大多数 Java Web 应用程序服务器中,都有一个组件为您处理会话(但您可以在必要时配置该组件并与之交互)。在 Tomcat 中,它是Manager component。
【讨论】:
如果你真的需要它,你可以鼓励你的用户使用注销功能,但一般大多数人会忽略它。
如果您真的需要它,您可以使用 onUnload javascript 事件来捕获您的一些用户导航到另一个站点的事件。在这个问题Alternative for JavaScript onUnload 中可以找到有关 onUnload 的一些一般信息以及在哪些情况下它不起作用。用于排除指向您自己的域 http://www.dynamicdrive.com/forums/archive/index.php/t-4947.html 的链接的丑陋黑客。
同样,除非您真的需要它,否则请坚持配置应用服务器的会话处理。
【讨论】:
我需要使用哪些策略来管理会话数量并消除不需要的会话?
您不需要,应用程序服务器会为您执行此操作。更准确地说,容器将HttpSession 保存在内存中,直到关联的用户在一段时间内处于非活动状态,此时会话超时。那时,会话可以被垃圾收集。这意味着HttpSession 对象至少在默认配置超时值中指定的时间长度内保留在内存中,除非您以编程方式将它们删除。这通常是通过在调用HttpSession#invalidate() 方法时公开注销功能来完成的。但绝对不能保证用户会使用它。
我如何知道不再需要会话?
您如何知道用户在他的屏幕后面正在做什么?这就是容器为您处理的原因,您应该让他完成它的工作。只需遵循一些最佳实践,即可让您的应用程序在没有内存问题的情况下进行扩展:
HttpSession的使用(不要把整个地球都放在它上面)。HttpSession 中删除不再使用的对象。【讨论】: