2012-04-20 20 views
1

我需要使持久性和用户特定的会话计数器。我做了这个Tomcat持久性和用户特定的会话计数器

package my.package; 

import javax.servlet.http.HttpSessionListener; 
import javax.servlet.http.HttpSessionEvent; 
import javax.servlet.http.HttpSession; 
import java.util.HashMap; 

public class SessionCounter implements HttpSessionListener { 

    private static HashMap activeSessions; 

    public SessionCounter() { 
     //How to restore session count? 
     activeSessions = new HashMap(); 
    } 

    public void sessionCreated(HttpSessionEvent se) { 
     HttpSession session = se.getSession(); 
     String userName = session.getAttribute("username"); 
     Integer count = (Integer) activeSessions.get(userName); 
     if (count != null) { 
      activeSessions.put(userName, Integer.valueOf(count.intValue() + 1)); 
     } else { 
      activeSessions.put(userName, new Integer(1)); 
     } 
    } 

    public void sessionDestroyed(HttpSessionEvent se) { 
     HttpSession session = se.getSession(); 
     String userName = session.getAttribute("username"); 
     Integer count = (Integer) activeSessions.get(userName); 
     if (count != null && count.intValue() > 0) { 
      activeSessions.put(userName, Integer.valueOf(count.intValue() - 1)); 
     } 

    } 

    public static HashMap getActiveSessions() { 
     return activeSessions; 
    } 
} 

即使在重新启动tomcat后会话仍处于活动状态,但存储在我的activeSessions变量中的会话计数丢失。如何在重新启动后恢复会话计数?

回答

0

当Tomcat关闭时(即通过关闭脚本而不是通过查杀进程)所有会话都会被序列化并在下一次启动时被恢复。

一个HttpSessionListener将总是被重新创建,因此你的HashMap被新实例化并且信息丢失。您将不得不编写一个实现可串行化的模型,该模型保存您的数据,并在Tomcat关闭时将其存储到磁盘。

+0

&|也许是一个跟踪会话和存储数据库的过滤器? – 2012-04-26 22:37:17