Przeglądałem wiele postów na ten temat, ale nie mogłem znaleźć rozwiązania, które działa w moim przypadku.Przekierowanie po przekroczeniu czasu HttpSession
używam Java EE 6 z JSF 2.0 (rozmieszczony na JBoss AS 7.1)
W moim web.xml
mam:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
i Chcę użytkownik zostanie przekierowany na stronę logowania gdy sesja automatycznie przekroczy limit czasu.
co próbowałem:
Podejście 1: stosując filtr
Próbowałem następujący filtr:
@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() {
}
}
W web.xml
Próbowałem
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
i
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
Filtr działa jak nazywa się na każde żądanie (rejestrowanie „fiter nazywany” w konsoli). Jednak nie jest wywoływana, gdy sesja przekroczyła limit czasu.
Podejście 2: HttpSessionLister
Próbowałem użyć HttpSessionListerner
. Metoda nazywa się o następującym podpisie:
public void sessionDestroyed(HttpSessionEvent se) {
}
Nie mogłem przekierować do konkretnej strony. Kiedy chcę przekierować użytkownika, zwykle używam NavigationHandler
z FacesContext
, ale w tym przypadku nie ma potrzeby powrotu do stanu sprzed FacesContext
(FacesContext.getCurrentInstance()
).
Zgodnie z tym post, HttpListener nie może przekierować użytkownika, ponieważ nie jest częścią żądania.
Pytanie
co jest najlepszym sposobem, aby przejść do rozwiązania tego problemu? Co mogę zrobić, aby jedno z dwóch wyżej wymienionych podejść zadziałało?
pokrewne: http://stackoverflow.com/q/ 4992526/1065197 –
@ LuiggiMendoza: Ciekawe dzięki. Chociaż nigdy nie widziałem "ViewExpiredException" i chciałbym, jeśli to możliwe, przekierować na stronę logowania bez konieczności klikania przez użytkownika. – phoenix7360
Potrzebna jest jakaś forma odpytywania po stronie klienta, aby uruchomić 302 po stronie serwera. bicie serca ... –