2013-04-20 18 views
6

Le applicazioni JSF possono generare ViewExpiredException s quando una sessione è scaduta. Questo evento sarà abbastanza comune quando si hanno ospiti sul proprio sistema. Perciò l'applicazione gestirà l'evento senza alcuna difficoltà per l'ospite, come segue:ViewExpiredException gestito da error-page, ancora nel registro

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/expired</location> 
</error-page> 

Quando un ospite tenta di inviare una richiesta su una sessione scaduta, viene rediretto a /expired. Poiché non considero questo Exception un problema che vale la pena menzionare, vorrei evitare di scrivere lo stacktrace nel log del mio server delle applicazioni.

Come posso realizzare questo?

risposta

7

Ci sono fondamentalmente 2 opzioni che si riducono ciascuna alla stessa soluzione: catturare, sopprimere e navigare nella pagina di errore tutto da solo usando uno servlet filter o un JSF exception handler. In questo modo l'eccezione non raggiungerà il servlettaintainer che quindi gestirà e registrerà automaticamente.

A condizione che la pagina di errore fa davvero il lavoro per voi (questo vale a dire non funziona con le richieste JSF Ajax, a meno che non hai un personalizzato JSF ExceptionHandler), poi un filtro servlet mappato su pattern URL corrispondente richieste JSF che fa il seguente nel suo metodo doFilter() dovrebbe essere sufficiente:

try { 
    chain.doFilter(request, response); 
} catch (ServletException e) { 
    if (e.getRootCause() instanceof ViewExpiredException) { 
     request.getRequestDispatcher("/expired").forward(request, response); 
    } else { 
     throw e; 
    } 
} 

Se si desidera coprire le richieste di JSF Ajax così, allora non si può andare in giro un gestore di eccezioni JSF. Dirigetevi verso le seguenti relative risposte per vedere alcuni esempi concreti: