Я смотрел много сообщений по этой теме, но не смог найти решение, которое работает в моем случае.
Я использую Java EE 6 с JSF 2.0 (развернутый на JBoss AS 7.1)
В моем web.xml
у меня есть:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
и я хотят, чтобы пользователь был перенаправлен на страницу входа в систему, когда сеанс автоматически отключается.
что я пробовал:
Подход 1: использование фильтра
Я пробовал следующий фильтр:
@WebFilter()
public class TimeOutFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
System.out.println("filter called");
final HttpServletRequest req = (HttpServletRequest) request;
final HttpSession session = req.getSession(false);
if (session != null && !session.isNew()) {
chain.doFilter(request, response);
} else {
System.out.println("Has timed out");
req.getRequestDispatcher("/logon.xthml").forward(request, response);
}
}
@Override
public void destroy() {
}
}
В web.xml
я пробовал
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
и
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
Фильтр работает так, как он вызывается при каждом запросе (ведение журнала "fiter called" в консоли). Однако он не вызывается, когда сеанс заканчивается.
Подход 2: HttpSessionLister
Я попытался использовать HttpSessionListerner
. Метод, получивший следующую подпись:
public void sessionDestroyed(HttpSessionEvent se) {
}
Я не смог перенаправить на определенную страницу. Когда я хочу перенаправить пользователя, я обычно использую NavigationHandler
из FacesContext
, но в этом случае нет FacesContext
(FacesContext.getCurrentInstance()
возвращает null
).
В соответствии с этим сообщением HttpListener не может перенаправить пользователя, потому что он не является частью запроса.
Вопрос
Каков наилучший способ решить эту проблему? Что я могу сделать, чтобы один из двух вышеупомянутых подходов работал?