Вызвать метод незадолго до истечения сеанса - PullRequest
15 голосов
/ 15 октября 2010

В моем веб-приложении есть пользователи, которые входят в систему.Тайм-аутДо истечения сеанса я хотел бы выполнить метод для очистки некоторых блокировок.

Я реализовал sessionListener, но как только я достиг public void sessionDestroyed(HttpSessionEvent event), сеанс уже закончился, и мне нужны некоторые данные из него, поэтому я хотел бы выполнить метод (которому нужен сеанс живым и иметь доступ к FacesConfig.getCurrentInstance()) до истечения срока действия сеанса.

Как я могу это сделать?Есть идеи?Это мой слушатель сессии:

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());
    }
}

Но я получаю NullPointerException на FacesContext.getCurrentInstance().getApplication(), потому что либо getCurrentInstance равно нулю, либо getApplication возвращает ноль

Ответы [ 2 ]

18 голосов
/ 15 октября 2010

Вы можете добиться этого, внедрив HttpSessionBindingListener, вам необходимо зарегистрировать сеанс, который удерживает блокировку, вызвав registerSession (строка "sessionBindingListener" может не изменяться). Контейнер будет вызывать метод 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() );
    }
}
5 голосов
/ 13 мая 2015

Еще одно элегантное решение:

Просто добавьте @PreDestroy Аннотация к Session-Bean!Если сеанс будет уничтожен, он предварительно вызовет PreDestroy для всех SessionBeans, там вы можете выйти из системы и все!

Хотя в настоящее время это не работает со многими ApplicationServer, похоже, неясный сегментСпецификация JSF.Так что переход с принятым ответом (HttpSessionBindingListener) будет необходим, пока @PreDestroy не будет работать так, как задумано, на всех серверах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...