2009-10-01 2 views

ответ

4

Как правило, сервер (Tomcat, Glassfish ...), на котором размещено веб-приложение, обрабатывает тайм-аут для сеанса.

Например, в Tomcat, вы можете определить время ожидания сеанса для определенного веб-приложения, добавив на следующие строки в файле web.xml:

<session-config> 
    <session-timeout>30</session-timeout> 
</session-config> 

Это позволит установить тайм-аут до 30 минут.

Когда пользователь не отправляет какой-либо запрос за время, превышающее этот определенный тайм-аут, сеанс на сервере недействителен. Если пользователь пытается повторно подключиться после того, как сеанс был признан недействительным, он, как правило, будет перенаправлен на другую страницу или на страницу с ошибкой.

Вы можете создать собственный фильтр JSF, который автоматически перенаправит пользователя на страницу timeout.html. Вот пример такого фильтра:

public class TimeoutFilter implements Filter { 

    private static final String TIMEOUT_PAGE = "timeout.html"; 
    private static final String LOGIN_PAGE = "login.faces"; 

    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { 
    if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) { 
     HttpServletRequest requestHttp = (HttpServletRequest) request; 
     HttpServletResponse responseHttp = (HttpServletResponse) response; 
     if (checkResource(requestHttp)) { 
      String requestPath = requestHttp.getRequestURI(); 
      if (checkSession(requestHttp)) { 
       String timeoutUrl = hRequest.getContextPath() + "/" + TIMEOUT_PAGE; 
       responseHttp.sendRedirect(timeoutUrl); 
       return; 
      } 
     } 
     filterChain.doFilter(request, response); 
    } 

    private boolean checkResource(HttpServletRequest request) { 
     String requestPath = request.getRequestURI(); 
     return !(requestPath.contains(TIMEOUT_PAGE) || requestPath.contains(LOGIN_PAGE) || requestPath.equals(hRequest.getContextPath() + "/")); 
    } 

    private boolean checkSession(HttpServletRequest request) { 
     return request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid(); 
    } 

    public void destroy() { 
    } 

} 
+0

это не удастся, если вы впервые получите URL-адрес не в методе checkResource. не так ли? не могли бы вы получить после этого действие с истекшим сроком действия, даже если вы просто обращаетесь к странице в первый раз? – 0m4r