所以我做了一个简单的会话监听器——网上有很多:
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
class SessionListener implements ServletContextListener, HttpSessionListener {
private static final int MAX_INACTIVE_INTERVAL = 1000; // in secs
// static AtomicInteger numOfSessions;
// singleton ? static ?
static int numOfSessions;
static ServletContext context;
@Override
public void sessionCreated(HttpSessionEvent se) {
se.getSession().setMaxInactiveInterval(MAX_INACTIVE_INTERVAL);
increase();
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
decrease();
}
private synchronized void increase() {
++numOfSessions;
context.setAttribute("numberOfSessions", numOfSessions);
System.out.println("SessionListener - increase - numberOfSessions = " +
numOfSessions);
}
private synchronized void decrease() {
--numOfSessions;
context.setAttribute("numberOfSessions", numOfSessions);
System.out.println("SessionListener - decrease - numberOfSessions = " +
numOfSessions);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("SessionListener - contextDestroyed");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
context = sce.getServletContext();
System.out.println("SessionListener - contextInitialized : " +
context);
}
}
_重度_编辑_
我在 Eclipse Juno 上使用 Glassfish 3.1.2。会话是通过相关 servletrequest.getSession()
中的方法创建的。doPost()
当我重新部署项目(保存时)时decrease()
,会话自然会失效。
现在,Eclipse glassfish 插件中默认启用“跨重新部署保留会话” - 所以当我再次在 Eclipse 中保存项目并重新部署时,我得到:
INFO: SessionListener - decrease - numberOfSessions = -1
含义:GF 重新创建会话但不调用侦听器 - 因此在重新部署时会话无效 - 但由于sessionCreated()
未调用我的会话计数为 0。
我需要一个解决方法!
历史(它帮助我了解发生了什么):
如果您在运行 tomcat 的情况下修改并重新编译 java 程序,tomcat 首先通过调用会话侦听器删除所有会话,然后重新创建具有相同会话 ID 的新会话对象edit和除不可序列化对象 (?) /edit之外的所有属性,但是这次它不会调用注册的会话监听器。
注意:我对会话保存一无所知,并且由于会话没有被完全保存(POJO 会话属性被消灭了——据我所知,它现在应该是可序列化的——对吗?文档?)真的需要一段时间才能理解什么正在继续。