我使用servlet上下文来保存哈希映射中登录用户的详细信息。如何清除20分钟后闲置的用户的用户ID?
答案 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。