Glassfish - 跨重新部署保留会话 - 在会话重新创建时不调用SessionListener

时间:2012-07-18 23:21:31

标签: glassfish-3 servlet-3.0

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

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(它帮助我理解了发生了什么):

  

如果使用tomcat修改和重新编译java程序   运行,tomcat首先通过调用会话监听器删除所有会话,   然后重新创建具有相同会话ID 编辑 的新会话对象以及除非可序列化对象之外的所有属性(?) / edit ,   但这次它在执行此操作时不会调用已注册的会话侦听器。

注意:我对会话保存一无所知,因为会话没有完全保存(POJO会话属性被消灭了 - 据我所知它现在应该可以序列化以保存 - 对吗?docs?)它真的需要一段时间了解发生了什么。

0 个答案:

没有答案