2011-01-16 5 views
1

gibt es eine Möglichkeit zu überprüfen, ob es eine aktive Sitzung direkt in der JSF-Seite gibt? Ich habe diese versuchen, aber es funktioniert nicht:Wie überprüfe ich, ob es auf einer JSF-Seite eine aktive Sitzung gibt?

<p:ajaxStatus onerror="#{session == null ? 'idleDialog.show();' : null}" 

danken Ihnen im Voraus

@Update ich sehe haben, dass onerror nicht selbst wenn viewExpiredException occurr abgefeuert wird.

+1

In Verbindung stehende Frage: http://stackoverflow.com/questions/2319020/mvc-with-jquery-handling-session-expire – BalusC

+0

Verwenden Sie für Ihr Update einen PrimeFaces-Release-Kandidat anstelle der endgültigen Version? 2.2 RC1 hat einen Fehler: http://code.google.com/p/primefaces/issues/detail?id=1471 Dies ist eine andere Geschichte. – BalusC

Antwort

3

Es gibt immer eine aktive Sitzung zum Zeitpunkt der Auswertung der EL. Wenn nicht, bevor die Seite geöffnet wurde, wird sie automatisch erstellt.

In JSF sind ablaufende Sitzungen ein Problem wegen der sogenannten "State Saving Method". Standardmäßig wird der Status der generierten Seite in der Sitzung gespeichert. Wenn Sie versuchen, das Formular zu senden, und die Sitzung abgelaufen ist, ist der Status verloren und daher tritt ein Fehler auf.

Aber auch in diesem Fall wird eine neue Sitzung generiert. So, wie BalusC erwähnt, können Sie die Sitzung am Leben halten - Umfrage mit AJAX-Anfragen (zB Richfaces hat solche Einrichtungen), so dass die Sitzung nie

abläuft
+0

Ja, ich weiß das, aber ich muss überprüfen, ob die Sitzung abgelaufen ist und so einen Dialog zur Wiederherstellung der Sitzung öffnen. –

+1

Wie möchten Sie die Sitzung wiederherstellen, wenn sie abgelaufen ist? Sie möchten die Sitzung lieber so lange am Leben erhalten, wie der Benutzer auf der Seite aktiv ist, oder sofort nach Ablauf der Sitzung auf eine Fehler-/Anmeldeseite umleiten. – BalusC

+0

Ich kann eine neue Sitzung erstellen, die einfach eine h: -Schaltfläche im Dialog anzeigt, so dass der Benutzer darauf klickt und dadurch eine neue Sitzung generiert. @Bozho ja mit Ajax. Die in web.xml nicht wok –

0

Sie können den folgenden EL-Ausdruck in JSF 2.0 verwenden:

#{facesContext.externalContext.getSession(false) == null}

Beachten Sie, dass durch Referenzieren des impliziten EL-Objekts diese automatisch (erneut) erstellt wird. Dieser kann somit niemals zum Testen verwendet werden.

z.

Angenommen, Sie die Sitzung in einer Backing Bean für ungültig erklärt würden, und ein Facelet mit folgendem Inhalt wiedergegeben wurde:

#{facesContext.externalContext.getSession(false) == null} 
#{session.new} 
#{facesContext.externalContext.getSession(false) == null} 

Diese machen würde:

true true false 

Die Sitzung wird zunächst wirklich weg , aber indem das implizite EL-Objekt referenziert wird, wird es erneut erzeugt (und wird in dem neuen Zustand sein). Der zweite Test findet dann die Sitzung wieder da sein.

+2

Obwohl dies technisch korrekt ist, erfüllt dies nicht die anfängliche funktionelle Anforderung von OP, eine JS-Warnung/einen JS-Dialog immer dann anzuzeigen, wenn die Sitzung abgelaufen ist, während die Seite noch im Browser geöffnet ist. Ihre Antwort geht davon aus, dass der Client eine brandneue synchrone HTTP-Anforderung nach dem Ablauf der Sitzung manuell auslösen muss (und dass keine mit der Sitzung/Ansicht verbundenen verwalteten Beans an die Seite gebunden sind). Ich muss jedoch zugeben, dass das OP dies in der Frage nicht deutlich genug ausgedrückt hat. – BalusC

+0

Ja, Sie haben Recht. Ich konzentrierte mich ausschließlich auf die Titelfrage "Wie überprüfe ich, ob es auf einer JSF-Seite eine aktive Sitzung gibt?". Um das zu erreichen, was das OP auf funktionaler Ebene will, ist es etwas komplizierter. Ich denke dabei an eine asynchrone Servlet 3.0-Aussetzungsanforderung, die wieder aufgenommen wird, wenn das Session Expired-Ereignis ausgelöst wird. Ich habe noch keine Erfahrung damit, daher fühle ich mich nicht wohl dabei, diese Antwort zu geben. –