# Session abgelaufen und direkter Aufruf



## freez (24. Apr 2008)

Hallo,

ich habe hier eine JSF/Facelets/Ajax4JSF Anwendung mit Datenbank im Hintergrund. Ich suche nach Best Practise Methoden, wie ich mit dem direkten Aufrufen von JSF Seiten und Session TimeOuts umgehen.

Viele von euch haben bestimmt schon Berührung mit den Themen gehabt:
1. Ein User klickt nach langer Inaktivität (> SessionTimout) auf einen Link, weil er nach dem Mittagessen weitermachen will. Wichtige Daten in der Session (z.B. Userdaten) sind verloren. Die Seite wird nicht richtig dargestellt und auch Klick auf Links könnten ungewollte Funktionen auslösen und unvorhersagbare Daten speichern oder laden.

2. Ein User speichert sich eine JSF Seite in seinen Favoriten. Beim Klick zwei Wochen später auf den Favorit fehlen in den Beans wichtige Informationen, die eigentlich in der Session waren. Hier ist dann das Problem, das es eine klare Struktur für die Navigation gibt, und das ein Einstieg dazwischen einfach nicht möglich ist, weil wichtige Informationen auf den vorhergehenden Seiten in der Bean gespeichert werden.

Ich freue mich über viele Antworten und geizt bitte nicht mit Details. Bitte auch mit ein paar Codeschnipsel hinzufügen, wenn ihr was habt.

Vielen Dank.


----------



## freez (24. Apr 2008)

Ich möchte natürlich gleich der erste sein ... ich habe nämlich auch einen Ansatz:

zu 1.: ein Cookie bei jedem erfolgreichen Request beim Client setzen. Sollte die Session ablaufen und der User klickt doch mal drauf, wird das Cookie geladen und damit die richtigen Daten geladen. Ist Clientseitig. Aber besser als nix und hilft auch leider nix bei Speicherung der URL in den Lesezeichen (jedenfalls nur begrenzte Zeit)

zu2.: ein iframe, welches entweder direkt aufgerufen wird, oder über ein Servlet gesendet. Darin laufen dann alle jsf- Seiten ab, ohne dass der User in seinem Browser ein Änderung in der Adressleiste bemerkt. Ein Speichern in den Lesezeichen speichert nur den Einstiegspunkt.


----------



## maki (25. Apr 2008)

1. Ein sog. SessionTimeoutFilter kümmert sich darum
2. GET zugriffe werden mit einem autom. Logout geahndet


----------



## y0dA (25. Apr 2008)

maki hat gesagt.:
			
		

> 1. Ein sog. SessionTimeoutFilter kümmert sich darum
> 2. GET zugriffe werden mit einem autom. Logout geahndet



Und wo gibts diesen Filter bzw wie ist jener einzubinden?


----------



## maki (25. Apr 2008)

Den Filter gibt's bei google, oder bei Obi 

Mein erstes google Ergebnis bei der Suche nach "jsf sessiontimeoutfilter":
http://techieexchange.wordpress.com/2008/02/21/jsf-session-expired-timeout-solution/

Gibt bestimmt noch mehr  mal bessere, mal schlechtere...


----------



## y0dA (25. Apr 2008)

Mal ne naive Frage, kann ich soviele Filter benutzen wie ich möchte?


----------



## maki (25. Apr 2008)

Ja, das ist der Sinn der Filter 

Manche Filter (zB. Ajax4Jsf) setzen aber eine bestimmte Sequenz voraus (A4J muss immer der erste sein), aber normalerweise gibt es diese Einschränkung nicht.


----------



## y0dA (25. Apr 2008)

maki hat gesagt.:
			
		

> Ja, das ist der Sinn der Filter
> 
> Manche Filter (zB. Ajax4Jsf) setzen aber eine bestimmte Sequenz voraus (A4J muss immer der erste sein), aber normalerweise gibt es diese Einschränkung nicht.



Bin heute nicht auf der Höhe! Ich benutze ja bei meinem aktuellen Projekt eh auch schon 2 Filter..danke für die Info.


----------



## freez (25. Apr 2008)

THX @ maki: zu Punkt 1: habe gleich deinen Vorschlag mit meiner Lösung kombiniert. Frägt der User an,ohne eine gültige Session, wird in dem SessionTimeoutListener nach dem Cookie geschaut und falls vorhanden die Session wieder initiiert und auf eine bestimmte Seite geleitet. Falls nicht vorhanden, kommt eine Fehlerseite mit TimeOut und nen Link zur Startseite. Ich überlege noch, ob ich im ersten Fall mit Cookie ne Meldeseite dazwischenschalte und dem User darüber informiere, dass er zu lang weg war. Haltet Ihr es für sinnvoll?



> 2. GET zugriffe werden mit einem autom. Logout geahndet



Kannst du den Punkt etwas vertiefen? Mir fehlt ein Anfang für die Realisierung und überhaupt die Vorstellung, wie sich das dem User präsentiert.


----------



## maki (25. Apr 2008)

> Ich überlege noch, ob ich im ersten Fall mit Cookie ne Meldeseite dazwischenschalte und dem User darüber informiere, dass er zu lang weg war. Haltet Ihr es für sinnvoll?


Weiss ehrlich gesagt nicht wie man Sessions reinitialisiert, aber das Vorgehen auf eine best. Seite weiterzuleiten aus dem Filter (Your Session has expiriered oder so ähnlich) mit Link auf die Loogin Serite ist so gut wie immer so umgesetzt, also Standard 



> Kannst du den Punkt etwas vertiefen? Mir fehlt ein Anfang für die Realisierung und überhaupt die Vorstellung, wie sich das dem User präsentiert.


Nun, die Frage ist eigentlich, ob ihr sowas wie "permalinks" für Favouriten etc. anbieten *müsst*, dann müssten die nötigen Daten in der URL mitgeschickt werden... dass das nicht trivial ist leuchtet ein.

Relativ einfach ist es allerdings, alle GET requests zu blocken (also URLS im Browser), navigiert werden kann nur ausschliesslich durch die Anwendung selbst. 
Das einzig hakelige kann sein, alte Anwendungen so umzurüsten, das nur noch POST requests versendet werden.


----------



## freez (25. Apr 2008)

> Weiss ehrlich gesagt nicht wie man Sessions reinitialisiert


reinitialisieren ist der verkehrte Ausdruck. Besser ist wohl die neue Session so initialisieren, dass die Beans alle benötigten Informationen haben. Ich benötige dazu nur einen bestimmten String in der Session. Den kann ich mir aus dem Cookie holen. Ist ne Information, die der User eh kennt und was auch gern anderen bekannt sein darf, also nix geheimes. So kriege ich wieder eine saubere Session.



> Relativ einfach ist es allerdings, alle GET requests zu blocken



Wie realisiere ich das? Mir fällt nix gescheites dazu ein.



> Nun, die Frage ist eigentlich, ob ihr sowas wie "permalinks" für Favouriten etc. anbieten müsst


einen solchen Permalink habe ich bereits. Dieser geht auf die Startseite der Anwendung selbst. Dahinter steckt ein Servlet, welches die Session entsprechend initialisiert, damit auch auf der Startseite was gescheites ausgegeben wird. Eigentlich wäre es mir lieb, wenn während der gesamten Zeit dieser URL angezeigt wird auch bei Navigation durch die Anwendung. Deswegen auch das iframe.


----------

