2009-08-04 7 views
6

Ho una serie di pagine di registrazione che si costruiscono l'una sull'altra. Alla scadenza della sessione degli utenti, ho un listener che pulisce tutto sul server e funziona benissimo. Ma, se l'utente tenta di fare qualsiasi altra cosa, voglio solo reindirizzare loro la prima pagina della serie. Tuttavia, il mio filtro non sembra funzionare correttamente. Continuo a ricevere javax.faces.application.ViewExpiredExceptionGestione di un ViewState scaduto in JSF e Richfaces

Qual è la migliore pratica per gestire questa eccezione? Non posso davvero gestire solo in web.xml perché è troppo globale. Inoltre, la pagina degli errori viene sottoposta a rendering da qualche codice JSF - sembra che devo capire che questo sta accadendo usando un PhaseListener quindi l'eccezione non si verifica in primo luogo, ma non sono stato in grado di trovare un buon modello per come farlo. Qualche idea?

risposta

1

Penso che tu sia la traccia corretta con un listener di fase. Essenzialmente impostato qualcosa in sessione sulla prima pagina. Quindi, nell'ascoltatore di fase, cerca il valore nella sessione. Se non esce, esegui un reindirizzamento. Il trucco è farlo all'inizio del processo di ascolto delle fasi. Non si sa esattamente da che parte del processo il listener di fase stia lanciando l'eccezione.

0

È possibile verificare se si sessione è invalida o no

booleano sessionInValid = httpServletRequest.getRequestedSessionId() = null & & httpServletRequest.isRequestedSessionIdValid()!!;

Qui la sessione di variabile booleanaInValid restituirà true se la sessione è invalidata con qualsiasi mezzo.

È possibile aggiungere questo in un filtro o un listener, quindi configurarlo nel file web.xml.

1

Il modo in cui gestisco questo è di aggiungere un filtro al web.xml mappato solo agli URL che si desidera tracciare. Questo filtro controlla se la sessione è scaduta e quindi inoltra a una pagina di accesso, se lo è. Dovrebbe funzionare se il filtro viene eseguito prima dell'esecuzione di qualsiasi codice JSF.

2

Richfaces ha il proprio meccanismo per gestire ViewExpiredException, guarda Richfaces docs.

+0

ma sembra che funzioni solo per richieste Ajax – Inv3r53

+0

Che si riferisce a * sessione * scadenza, non visualizzazione scadenza. – EJP

1

Il modo in cui l'ho gestito in passato consiste nell'utilizzare un listener che controlla un campo in un bean di sessione gestito. Se la sessione utente scade, un listener ripulisce l'mbean e contrassegna l'utente come non connesso. Ogni richiesta viene inviata attraverso il listener e se i requisiti non vengono soddisfatti, l'utente viene forzato a uscire dal sito. Non ho mai ottenuto ViewExpiredException nel mio registro. L'unica volta che si è verificata questa eccezione è se il server è stato riavviato e l'utente richiede una pagina quando ha una sessione attiva precedente.