所以我做了一个简单的会话监听器 - 网上有很多:
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);
}
}
_heavily_edited _
我在Eclipse Juno上使用Glassfish 3.1.2。会话通过相关servlet中request.getSession()
方法中的doPost()
创建。当我重新部署项目时(保存时)decrease()
被调用 - 会话自然失效。
现在,“在重新部署中保留会话”在Eclipse glassfish插件中默认启用 - 所以当我再次在Eclipse中保存项目并重新部署时,我得到:
INFO: SessionListener - decrease - numberOfSessions = -1
含义:GF重新创建会话但不调用侦听器 - 因此在重新部署时会话无效 - 但由于未调用sessionCreated()
,因此会话计数为0。
我需要一个解决方法!
Historical(它帮助我理解了发生了什么):
注意:我对会话保存一无所知,因为会话没有完全保存(POJO会话属性被消灭了 - 据我所知它现在应该可以序列化以保存 - 对吗?docs?)它真的需要一段时间了解发生了什么。如果使用tomcat修改和重新编译java程序 运行,tomcat首先通过调用会话监听器删除所有会话, 然后重新创建具有相同会话ID 编辑 的新会话对象以及除非可序列化对象之外的所有属性(?) / edit , 但这次它在执行此操作时不会调用已注册的会话侦听器。