1

所以我做了一个简单的会话监听器——网上有很多:

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 会话属性被消灭了——据我所知,它现在应该是可序列化的——对吗?文档?)真的需要一段时间才能理解什么正在继续。

4

0 回答 0