2016-04-28 5 views
0

Ich habe Cookies verwendet, um nicht vertrauliche Daten über Sitzungen hinweg zu teilen. Ich möchte einige lastUsedEntity (ein Zeichenfolgenliteral) aus der aktuellen Sitzung beim Benutzerprotokollierungsereignis speichern, damit diese Entität bei der nächsten Anmeldesitzung gelesen/verwendet werden kann. Die genannte Entität gehört zu einer Session-Bean meiner Anwendung.Wie werden Daten aus einer alten Sitzung in der nächsten Sitzung verwendet?

Ich beschloss, diese Entität in @PreDestroy Methode der Session-Bean zu extrahieren und zu speichern. Die Methode wurde erfolgreich beim Sitzungszeitlimit der Anwendung ausgeführt. Das Speichern des Cookies ist fehlgeschlagen, weil FacesContext.getCurrentInstance() in der @PreDestroy-Methode null war, möglicherweise weil der JSF-Lebenszyklus-Anforderungs-Antwort-Zyklus bis dahin abgeschlossen wurde. Ich versuchte, FacesContext.getCurrentInstance() in @PostContruct Methode meiner Sitzungsbohne zu cachen, damit ich auf faces Kontext zwischengespeicherte Instanz zurückgreifen konnte, aber dann sah ich ein anderes Problem java.lang.IllegalStateException at com.sun.faces.context.FacesContextImpl.assertNotReleased, weil ich FacesContext als Instanzvariable meiner Sitzungszielklasse verwendete. Ich würde mich freuen, wenn ich hier ein paar Fragen stellen oder eine bessere Idee haben könnte, um meine alten Sitzungsdaten für die weitere Verwendung in diesem Szenario beizubehalten.

Antwort

3

Es gibt nicht unbedingt Mittel einer HTTP-Anfrage, wenn eine HTTP-Sitzung aufgrund von Inaktivität des Endbenutzers auf der Serverseite abgelaufen ist. Der Endbenutzer selbst ist der einzige, der eine HTTP-Anfrage senden kann. Wenn es keine HTTP-Anfrage gibt, die die FacesServlet aufgerufen hat, gibt es auch keine FacesContext. Ganz zu schweigen von einer HTTP-Antwort, auf die Sie den Cookie zurückgeben könnten.

Sie sollten Ihre Logik besser überdenken. Z.B. Setzen Sie den Cookie sofort bei jeder Anfrage und überschreiben Sie die vorherige, ggf. auf einen bestimmten Pfad und/oder mit einem Zeitstempel im Cookie-Wert. Abhängig von der konkreten funktionalen Anforderung kann es jedoch bessere Möglichkeiten geben, da Cookies vom Endbenutzer vollständig manipuliert werden können und Sie absolut keine kritische Geschäftslogik davon abhängen sollten. Wenn es nur für die Präsentation gedacht ist, sollte es in Ordnung sein, andernfalls sollten Sie es besser in der Datenbank speichern, die dem angemeldeten Benutzer zugeordnet ist.

+0

Bisher habe ich gemacht, wie Sie sagten, setzen Cookie auf jeder Seite laden (oder Anfrage). Ich arbeite in einer mehrseitigen App. Jede Seite mit einer eigenen ID. Eine Seite leitet beim Abmelden zur Anmeldeseite um. Ich habe Cookie gesetzt mit einem Schlüssel namens "lastOpenedId" in 'PostConstruct' Methode nach der Landung auf jeder' ViewScoped' Seite. Diese ID stammt von einer sitzungsbezogenen Service-Bean. Aber ich musste es ändern, da ich eigentlich "lastExpiredId" speichern muss, d. H. Ich muss die ID einer Seite protokollieren, die aufgrund eines Sitzungszeitlimits ausgeloggt wurde. – user2918640

+1

Speichern Sie es in der DB. – BalusC

+0

Das ist, was ich als letzten Ausweg gedacht habe, es sei denn, ich könnte mir etwas einfallen lassen, das auf Web-Framework-Ebene gemacht werden könnte. – user2918640

Verwandte Themen