2009-08-04 8 views
6

Ich habe eine Reihe von Anmeldeseiten, die aufeinander aufbauen. Wenn die Benutzersitzung abläuft, habe ich einen Listener, der alles auf dem Server säubert und das funktioniert großartig. Aber wenn der Benutzer versucht, etwas anderes zu tun, möchte ich nur auf die erste Seite der Serie zurückleiten. Mein Filter scheint jedoch nicht korrekt zu funktionieren. Ich erhalte javax.faces.application.ViewExpiredExceptionUmgang mit einem abgelaufenen ViewState in JSF und Richfaces

Was ist die beste Praxis diese expcetion für den Umgang mit? Ich kann nicht wirklich in web.xml umgehen, weil das zu global ist. Außerdem wird die Fehlerseite von einem JSF-Code gerendert - es scheint, als müsste ich herausfinden, dass dies mit einem PhaseListener geschieht, so dass die Ausnahme nicht von vornherein auftritt, aber ich konnte kein gutes Modell finden wie man das macht. Irgendwelche Ideen?

Antwort

1

Ich denke, dass Sie die richtige Spur mit einem Phasenhörer sind. Stellen Sie im Wesentlichen auf der ersten Seite etwas in der Sitzung auf. Suchen Sie dann im Phasenlistener nach dem Wert in der Sitzung. Wenn es nicht beendet wird, dann führe eine Umleitung durch. Der Trick besteht darin, dies früh im Phasen-Listener-Prozess zu tun. Nicht genau, wo in diesem Prozess der Phasenlistener die Ausnahme auslöst.

0

können Sie überprüfen, ob Sie Sitzung ungültig ist oder nicht

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

Hier gibt die boolesche Variable sessionInValid true zurück, wenn die Sitzung auf irgendeine Weise ungültig wird.

Sie können dies in einem Filter oder Listener hinzufügen und dies in Ihrer Datei web.xml konfigurieren.

1

Die Art, wie ich damit umgehen ist ein Filter auf den web.xml nur auf die URLs, die Sie verfolgen möchten abgebildet hinzuzufügen. Dieser Filter überprüft, ob die Sitzung abgelaufen ist, und leitet sie dann an eine Anmeldeseite weiter, wenn dies der Fall ist. Es sollte funktionieren, wenn der Filter ausgeführt wird, bevor JSF-Code ausgeführt wird.

2

Richfaces hat ihren eigenen Mechanismus für den Umgang mit ViewExpiredException, Blick auf Richfaces docs.

+0

aber scheint, dass nur für AJAX-Anfragen arbeitet – Inv3r53

+0

dass * Ablauf zu * Sitzung bezieht, nicht Ablauf anzuzeigen. – EJP

1

So wie ich dies in der Vergangenheit behandelt haben, ist ein Hörer zu verwenden, die ein Feld in einer verwalteten Session Bean prüft. Wenn die Benutzer-Sitzung ein Zeitlimit überschreitet, bereinigt ein Listener die MBean und markiert den Benutzer als nicht angemeldet. Jede Anforderung wird über den Listener gesendet, und wenn die Anforderungen nicht erfüllt sind, wird der Benutzer aus der Site herausgedrängt. Ich bekomme ViewExpiredException nie in meinem Protokoll. Diese Ausnahme tritt nur dann auf, wenn der Server neu gestartet wurde und der Benutzer eine Seite anfordert, wenn er zuvor eine aktive Sitzung ausgeführt hat.