2009-10-01 4 views

Répondre

4

Généralement, le serveur (Tomcat, Glassfish ...) qui héberge l'application Web gère un délai d'attente pour une session.

Par exemple, dans Tomcat, vous pouvez définir le délai d'attente de session pour une application web particulière en ajoutant les lignes folowing dans le fichier web.xml:

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

Cela va régler le délai d'attente à 30 minutes.

Lorsqu'un utilisateur n'envoie aucune requête pendant une durée supérieure à ce délai défini, la session sur le serveur est invalidée. Si l'utilisateur tente de se reconnecter après l'invalidation de la session, il sera généralement redirigé vers une autre page ou vers une page d'erreur.

Vous pouvez développer votre propre filtre JSF qui redirigera automatiquement l'utilisateur vers une page timeout.html. Voici un exemple d'un tel filtre:

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

Ceci échouera lorsque vous accéderez pour la première fois à une URL qui ne figure pas dans votre méthode checkResource. n'est-ce pas? n'obtiendriez-vous pas alors un comportement expiré de session même si vous accédez simplement à la page pour la première fois? – 0m4r

Questions connexes