java - 在 session 过期之前调用方法

标签 java jsf servlets

我的 webapp 有登录的用户。有一个超时。在 session 过期之前,我想执行一个方法来清除一些锁。

我已经实现了一个 sessionListener 但是一旦我到达 public void sessionDestroyed(HttpSessionEvent event) session 已经消失,我需要它的一些数据,所以我会喜欢在 session 实际过期之前执行一个方法(需要 session 处于 Activity 状态并且能够访问 FacesConfig.getCurrentInstance())。

我该怎么做?有任何想法吗?这是我的 session 监听器:

public class MySessionListener implements HttpSessionListener {

    private static final Logger log = LoggerFactory.getLogger(MySessionListener.class);

    public MySessionListener() {

    }

    public void sessionCreated(HttpSessionEvent event) {
        log.debug("Current Session created : "
              + event.getSession().getId()+ " at "+ new Date());
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        // get the destroying session...

        HttpSession session = event.getSession();
        prepareLogoutInfoAndLogoutActiveUser(session);

        log.debug("Current Session destroyed :"
              + session.getId()+ " Logging out user...");

        /*
         * nobody can reach user data after this point because 
         * session is invalidated already.
         * So, get the user data from session and save its 
         * logout information before losing it.
         * User's redirection to the timeout page will be 
         * handled by the SessionTimeoutFilter.
         */

         // Only if needed
    }

    /**
     * Clean your logout operations.
     */
    public void prepareLogoutInfoAndLogoutActiveUser(HttpSession httpSession) {
        UserBean user = FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{user}", UserBean.class);
        LockBean lock = FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{lock}", LockBean.class);
        lock.unlock(user.getUsername());
        log.info("Unlocked examination for user: "+user.getUsername());
    }
}

但我在 FacesContext.getCurrentInstance().getApplication() 处得到了 NullPointerException 因为 getCurrentInstance 为空或 getApplication 返回 null

最佳答案

您可以通过实现 HttpSessionBindingListener 来实现,您需要通过调用 registerSession 注册一个持有锁的 session (字符串“sessionBindingListener”可能不会更改)。容器将在 session 超时之后和 session 被销毁之前回调valueUnbound()方法。

public class ObjectLock implements Serializable,HttpSessionBindingListener {
    public void valueBound(HttpSessionBindingEvent event) {
        log.info("valueBound:" + event.getName() + " session:" + event.getSession().getId() );

    }

    public void registerSession() {
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put( "sessionBindingListener", this  );
        log.info( "registered sessionBindingListener"  );
    }

    public void valueUnbound(HttpSessionBindingEvent event) {
        log.info("valueUnBound:" + event.getName() + " session:" + event.getSession().getId() );
               // add you unlock code here:
        clearLocksForSession( event.getSession().getId() );
    }
}

关于java - 在 session 过期之前调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3943368/

相关文章:

Java Servlet 和 Jquery

java - 布局管理器不起作用

java - 为什么 BufferedWriter write 方法会产生不同的结果?

java - JSP - 单击按钮时更新文本区域

java - 如何使用 apache-commons-io FileUtils.listFilesAndDirs 过滤某个目录的所有目录和子目录?

java - 自动完成不匹配的结果

jsf - 如何在primefaces数据表中显示可变数量的列

jsf - 如何将参数传递给显示对话框的 Primefaces 菜单项?

java.lang.NoClassDefFoundError : org/apache/commons/io/output/DeferredFileOutputStream 错误

java - 从 JSP Scriptlet 迁移到 Servlet