如何在Java中清除servlet上下文

时间:2011-06-01 10:40:48

标签: java servlets

我使用servlet上下文来保存哈希映射中登录用户的详细信息。如何清除20分钟后闲置的用户的用户ID?

4 个答案:

答案 0 :(得分:2)

可能您可以为应用程序将会话超时设置为20分钟,并确保每个用户都有一个活动会话,该会话还包含用户ID。如果用户空闲20分钟,则会话将被销毁。

然后,您可以编写一个HttpSessionListener,以便在会话被销毁时进行调用。从那里你可以获得用户ID(你之前已经存储过,可能是用户登录时),并在SessionContext中从你的HashMap中删除它。

答案 1 :(得分:1)

使用servlet会话管理使会话无效。如果空闲20分钟,web.xml下面的代码段会使会话无效。

    <session-config><session-timeout>20</session-timeout></session-config>

实现javax.servlet.http.HttpSessionListener.sessionCreated()以在创建会话时获得回调。使用

将此会话ID添加到servlet上下文
List<String> users = HttpSessionEvent.getSession().getServletContext().getAttribute("users");
users.add(session.getId());

实现javax.servlet.http.HttpSessionListener.sessionDestroyed(),它在会话被销毁时获得回调。使用

从servlet上下文中删除此会话
List<String> users = HttpSessionEvent.getSession().getServletContext().getAttribute("users");
users.remove(session.getId());

答案 2 :(得分:0)

  • ServletContextListener
  • 安排工作
  • 简单地使用HashMap concurrency方法,确保{{1}}

答案 3 :(得分:0)

最简单的方法是实现ServletContextListener,在contextInitialized()中启动一个可以完成工作的线程。在contextDestroyed中扼杀了线程。 Map应该是线程安全的:synchronized或Concurrent。