Можно ли поймать ViewExpriedException в PhaseListener?

Для целей ведения журнала мне интересно определить, когда в моем приложении JSF происходит тайм-аут сеанса.

Я реализовал PhaseListener, который проверяет, вошли ли пользователи в систему и активны ли их сеансы. Моя реализация метода afterPhase:

  • var url_accepted (используется в коде) содержит список общедоступных страниц, к которым пользователи должны иметь доступ, чтобы предоставить форму входа.

    public void afterPhase(PhaseEvent event) {
        FacesContext context = event.getFacesContext();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
    
        AuthenticationBean sessionBean = (AuthenticationBean) session.getAttribute("sessionBean");
    
        String url_req = context.getViewRoot().getViewId();
    
        //1. Check if user has a session and is logged in:
        if(((sessionBean == null) || (sessionBean != null && !sessionBean.isLoggedIn())) && !url_accepted.contains(url_req)){
            context.getApplication().getNavigationHandler().handleNavigation(context,null,"auth_error");
            return;
        }
    
    //2. Code continues in order to check if a logged user has permissions to access the requested page(not relevant):        
    }
    

Когда пользователь был отключен из-за тайм-аута сеанса, PhaseListener не может получить мой сеансовый компонент из ExternalContext и присваивает атрибуту сеансового компонента null. На данный момент я не могу различить, не входил ли пользователь в систему раньше или был отключен по тайм-ауту.

Я читал, что можно использовать errorPages, чтобы обнаружить исключение ViewExpiredException и перенаправить представление на определенную страницу. Но я не знаю, можно ли управлять этим исключением в моем исходном коде.

У меня вопрос: могу ли я поймать это ViewExpiredException внутри моей реализации PhaseListener, чтобы обработать тайм-аут сеанса?

Заранее спасибо.


person jmrodrigg    schedule 26.07.2012    source источник


Ответы (1)


Я столкнулся с тем же сценарием в проекте JSF. Решение состояло в том, чтобы использовать фильтр для обнаружения истекшего сеанса. BalusC (эксперт JSF) объясняет этот вопрос и показывает хороший пример:

Кроме того, не забудьте добавить session.invalidate() в методе выхода из системы и в обработчике времени ожидания сеанса.

person Luiggi Mendoza    schedule 26.07.2012
comment
Спасибо за ссылку и совет. Я посмотрю, смогу ли я адаптировать это решение BalusC в своем проекте. - person jmrodrigg; 27.07.2012
comment
Если у вас есть какие-либо вопросы, просто обновите свой пост и оставьте комментарий здесь, чтобы я мог вам помочь. - person Luiggi Mendoza; 27.07.2012
comment
Я анализировал пример, предложенный BalusC, но я не понимаю, где он управляет выходом из системы по тайм-ауту. Я думаю, он не предпринимает никаких действий. Проблема, с которой я столкнулся в моем приложении, уже работает из-за тайм-аута сеанса, но мне нужно поймать, когда это произойдет, чтобы я мог зарегистрировать, какой пользователь был отключен из-за этого. Дайте мне знать, если это уже реализовано в коде BalusC, я углублюсь в код более подробно. - person jmrodrigg; 31.07.2012