Ich weiß, dass dies eine große Chance hat, als Duplikat markiert zu werden, konnte aber nicht genau das finden, wonach ich suche
Dies ist ein häufiges Problem, und ich bin sicher, dass es eine gut definierte Best-Practice-Lösung gibt
Hintergrund
Eine einseitige SaaS-App verfügt über viele Drag & Drop-Funktionen. Der Benutzer kann über einen bestimmten Zeitraum ohne viel Serverkommunikation mit ihr interagieren
Die Serversitzung enthält nur Benutzerobjekte, die ein nicht persistentes Sitzungscookie verwenden
Die Sitzung läuft auf dem Server nach X Stunden ab
Einige Dinge werden nur beim Anmelden geladen
Problem
- Der Benutzer arbeitet an der App. Wenn er fertig ist, meldet er sich nicht ab, sondern lässt den Browser geöffnet
- Der Benutzer kommt nach mehr als X Stunden zurück (Sitzung auf dem Server ist ungültig)
- Der Benutzer interagiert mit der App, ohne dass eine Serververbindung erforderlich ist (schleppt und löscht Dinge, Textänderungen ...).
- Erst bei der nächsten Serverinteraktion (nehmen wir an, es gibt keine automatische Speicherung) wird der Benutzer auf die Anmeldeseite geworfen und verliert einen Teil seiner Arbeit
Mögliche Lösungen
Hier sind einige Lösungen, die ich im Sinn habe, die ich gerne hören würde, wenn es andere gibt und wenn irgendetwas grundlegend falsch ist.
1. Melden Sie den Benutzer niemals ab
- Wie? Halten Sie entweder eine lange Sitzung, ein dauerhaftes Cookie oder JavaScript-Ping "Keep Alive"
- Vorteile : Der Benutzer muss sich um nichts kümmern, behebt das Problem für ihn
- Nachteile : Nicht PCI-kompatibel, nicht sicher und erfordert Entwicklungsänderungen, z. B. Dinge, die nur bei der Benutzeranmeldung in die Sitzung geladen werden, müssen entweder in ein Pub-Untermodell verschoben werden (Ereignisänderungen abhören) oder ein Cache-Timeout aufweisen.
2. Lokaler Speicher
- Wie? Verwenden Sie einen neuen lokalen Speicher, um den Status vorübergehend zu speichern, wenn Sie abgemeldet sind, um zur Anmeldeseite umzuleiten und nach dem Anmelden beizubehalten
- Vorteile : Basis auch für die Unterstützung "offline arbeiten", nicht nur für die Behandlung des Sitzungszeitlimits
- Nachteile : Schwieriger zu implementieren, Statuszusammenführung des Datenbaums erforderlich, nicht alle Browser unterstützen
3. Automatisch speichern
Jede Benutzeraktion, die das Modell ändert, sollte sofort bestehen bleiben (oder über eine Art clientseitige Warteschlange), z. B. wenn sie ein Kontrollkästchen aktiviert, ein Textfeld ändert oder etwas per Drag & Drop zieht, sobald sie fertig sind, bleiben die Änderungen bestehen.
- Wie? Verwenden Sie ein MV ** -Framework (Backbone.js / Knockout.js / Ember.js / Angular.js usw.), um das Modell zu binden und Änderungen beizubehalten.
- Vorteile : Scheint eine saubere Lösung zu sein. Die Sitzung ist aktiv, solange der Benutzer aktiv ist. Es wird keine clientseitige Arbeit ausgeführt, ohne sie beizubehalten.
- Nachteile : Der letzte Aktionsbenutzer, der ausgeführt wird, nachdem ein Sitzungszeitlimit verloren gegangen ist.
4. Melden Sie den Benutzer nach Ablauf der Sitzung ab
Dies kann mehrere Ansätze haben
Fragen Sie den Server "Sitzung abgelaufen" - dies ist ein kleiner Haken 22 / Schrödingers Katze, da die bloße Frage an den Server die Sitzung verlängert (das Timeout neu startet).
- Wie? Entweder haben Sie einen Server, der solche Fragen unterstützt (ich kenne keine, aber ich komme aus Java), oder Sie können einfach eine Tabelle mit Sitzungs-IDs und der letzten Zugriffszeit manuell führen und den Server durch Übergeben der Sitzung fragen ID als Parameter anstelle des Cookies, ich bin nicht sicher, ob dies überhaupt möglich ist, aber es klingt gefährlich, unsicher und schlechtes Design, egal welche Anmeldeseite, bleibt bestehen, sobald Sie angemeldet sind
- Vorteile : Wenn es eine solche native Unterstützung auf Servern gab, klingt dies nach einer sauberen, legitimen Frage (zu fragen, ob Benutzer X noch eine Sitzung hat oder nicht, ohne sie zu erneuern, wenn dies der Fall ist)
- Nachteile : Wenn der Server dies nicht unterstützt (und ich weiß auch nicht, ob ein Server oder ein Framework über diese Funktionalität verfügt), birgt die Problemumgehung möglicherweise enorme Sicherheitsrisiken.
Eine Problemumgehung, die ich gehört habe, ist eine kurze Sitzung auf der Serverseite und ein Ping auf der Clientseite mit einer maximalen Anzahl von Pings
- Wie? Kurze Sitzung auf dem Server, Client pingt jede SitzungTimeOut / 2, hat maximale Wiederholungsversuche von Y.
- Vorteile : Behebt das Problem schnell und schmutzig
- Nachteile : Es fühlt sich wie ein Hack an, die Sitzungserneuerung selbst durchzuführen, anstatt den Server dies tun zu lassen
Client-seitiger Timer
Wie? Haben Sie einen Timer auf der Clientseite und synchronisieren Sie ihn mit dem Server, indem Sie ihn bei jeder Anforderung neu starten, um dem maximalen Zeitlimit für Serversitzungen abzüglich einiger Auffüllungen zu entsprechen. Nachdem der Benutzer keine Anforderung an den Server gesendet hat, zeigt die Benutzeroberfläche an, dass "Sitzungen sind" kurz vor einer Auszeit, willst du weitermachen? " (wie Sie es beim Online-Banking getan haben)
Vorteile : Behebt das Problem
- Nachteile : Ich kann mir nichts anderes vorstellen, als sicherzustellen, dass die Synchronisierung funktioniert
Die Frage
Ich vermisse wahrscheinlich etwas in der obigen Analyse, habe möglicherweise einige dumme Fehler und möchte, dass Ihre Hilfe sie korrigiert. Welche anderen Lösungen kann ich dafür haben?
now
. 4.2 klingt nach einer großartigen Möglichkeit, Ihren Server zu töten und die Kosten zu erhöhen. 4.3 Unter Android bin ich mir ziemlich sicher, dass der Vorgang angehalten wird, wenn Sie zum Startbildschirm zurückkehren. Dies kann auch den Timer auf der Clientseite beeinträchtigen.