Verwalten von Webapp-Sitzungsdaten / Controller-Datenfluss für mehrere Registerkarten
Ich habe ein Java-web-Anwendung, die speichert einige Daten in der session. Die Daten in der session ändert, wenn der Benutzer mit der Anwendung interagiert (z.B. Strömung ist, geleitet von einem controller, jeder controller hat mehrere Formular-Seiten, auf jeder Formular-Seite, einige Daten werden in der session und der Fluss geht zum nächsten Formular-Seite).
Das problem ist, dass einige Benutzer zu öffnen, die mehr als eine Registerkarte, um die Anwendung, die Sie jede Registerkarte mit einem anderen Schritt in der Strömung. An dieser Stelle Daten in die session versaut ist, da die tabs teilen sich die gleiche Sitzung (ca verwendet Cookies verwaltet Sitzungen).
Sagen die Nutzer, mit unterschiedlichen Browsern zu vermeiden, teilen die gleiche session-id (z.B. ein Firefox-Fenster und ein IE-Fenster) ist keine option, da sicherlich irgendwann jemand vergessen, dies zu tun und verwenden Sie stattdessen Tabulatoren, damit vermasselt Ihre Daten.
Indem einige überprüfungen, die erkennen, dass eine andere Strömung verlangt wird eine andere Registerkarte, und zeigen Sie eine Nachricht an den Benutzer sagen, dass das nicht erlaubt ist, ist keine option, da kotzt es der Benutzer, und das wollen wir nicht tun wir? 😀
Tatsache ist, dass mit einem anderen tab ist nützlich für die Benutzer, da Sie effizienter sind, was Sie in der Anwendung verwenden, für die, so führe ich diese option. Aber die Frage ist jetzt , wie man am besten verwalten die eine session-Daten mehr für die tabs?
Was ich dachte, war der controller generiert einen token, wenn es beginnt, den Fluss und übergeben Sie dieses token, um jede Formular-Seite, die wiederum sendet es zurück, sich selbst zu identifizieren. Wenn eine andere Registerkarte Anforderungen die gleichen controller-Aktion, wenn es einen ständigen Strom dann zu erzeugen, ein anderes token, und übergeben Sie herum.
Im Grunde möchte ich jeden flow ein token und die in der Sitzung werde ich nicht nur zu halten, einen Satz von Daten, aber Sie haben eine Reihe von Daten, die für jedes token und dann-match-Anfragen basierend auf dem token.
Nun das problem ist, dass dieser Ansatz eine Menge von Umschreibungen, um die Anwendung, und ich Frage mich, ob es eine best practice für die Verwaltung eine solche situation oder kann jemand empfehlen, andere Ansätze. Ich bin offen für Ideen.
Sind Sie auf diese situation? Wie sind Sie damit umgegangen?
InformationsquelleAutor der Frage Gabriela | 2010-12-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies geschieht in der Regel durch die Zuordnung eines windowId für jeden tab/Fenster und an jede Anforderung. Jsf unterstützt diese über orchestra. Spring mvc unterstützen wird es in der nächsten version.
Vor kurzem musste ich dies für einen einfachen Fall, also habe ich umgesetzt, es selbst. Dauerte eine halbe Stunde. Aber mein Spielraum war sehr begrenzt:
windowId
mit jeder Anforderung, und senden Sie es zurück für die nächste Anfrage. Das erste mal - erzeugen.Map<String, Object>
wo der Schlüssel ist diewindowId
InformationsquelleAutor der Antwort Bozho
Dies ist genau das, was Naht wurde geschaffen, um zu behandeln. Naht es gibt ein Konzept namens ein Gespräch die im Grunde genau das tut, was Sie erklärt. Gespräche sind im Grunde genommen ein Weg, zu teilen der Sitzung in viele Stücke, die ablaufen können, irgendwann timeout. Anschauen kann man sich den source code für die org.jboss.Naht.core.Manager-Klasse zu sehen, wie es tatsächlich umgesetzt und inspirieren lassen 😉
InformationsquelleAutor der Antwort Drew
Abhängig von der Komplexität Ihrer Anwendung, möchten Sie vielleicht zu untersuchen, die Umsetzung Registerkarten innerhalb der Anwendung. Dies gibt Ihnen Großhandel Kontrolle über den Ablauf, noch während die Nutzer mit den Funktionen, die Sie wollen. Ich würde argumentieren, es ist, bugwise, die stabilste Lösung, da Sie nicht haben eine Abhängigkeit auf die Weise, die der browser verarbeitet Sitzungen, die Minimierung der Anzahl der "known unknowns".
Natürlich, es gibt potenziell eine große Kosten im Voraus für diese, je nachdem, wie Ihr Programm aufgebaut ist. Ohne weitere Informationen über Ihre app, Ihr seid die besten platziert person zu entscheiden.
InformationsquelleAutor der Antwort Melv
Können Sie auch versuchen, wickeln Sie Ihre Anwendung in Adobe Air
Und dann beschränken Sie Ihre web-Anwendung zu werden, nur zugänglich von dieser Luft. Dadurch brauchen Sie nicht zu überlegen, die web-browser-Fragmentierung und deren einzigartiges Verhalten.
InformationsquelleAutor der Antwort Rudy