Для целей ведения журнала мне интересно определить, когда в моем приложении 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, чтобы обработать тайм-аут сеанса?
Заранее спасибо.