Ich habe mir eine neue Lösung ausgedacht, die ein wenig Overhead hat, aber anscheinend als Prototyp funktioniert. Eine Annahme ist, dass Sie sich für die Anmeldung in einer Ehrensystemumgebung befinden. Dies kann jedoch angepasst werden, indem Sie beim Wechseln der Registerkarte erneut ein Kennwort anfordern.
Verwenden Sie localStorage (oder ein gleichwertiges Element) und das HTML5-Speicherereignis, um festzustellen, wann eine neue Browserregisterkarte gewechselt hat, welcher Benutzer aktiv ist. Erstellen Sie in diesem Fall ein Ghost-Overlay mit der Meldung, dass Sie das aktuelle Fenster nicht verwenden können (oder deaktivieren Sie das Fenster auf andere Weise vorübergehend, damit es nicht so auffällig wird.) Wenn das Fenster wieder den Fokus erhält, senden Sie eine AJAX-Anforderungsprotokollierung der Benutzer wieder in.
Eine Einschränkung dieses Ansatzes: Sie können keine normalen AJAX-Anrufe (dh solche, die von Ihrer Sitzung abhängen) in einem Fenster ausführen, das nicht den Fokus hat (z. B. wenn Sie einen Anruf nach einer Verzögerung hatten), es sei denn Sie führen zuvor manuell einen AJAX-Neuanmeldeanruf durch. Alles, was Sie wirklich tun müssen, ist, zuerst Ihre AJAX-Funktion überprüfen zu lassen, um sicherzustellen, dass localStorage.currently_logged_in_user_id === window.yourAppNameSpace.user_id. Wenn nicht, melden Sie sich zuerst über AJAX an.
Ein weiterer Grund sind die Rennbedingungen: Wenn Sie das Fenster schnell genug wechseln können, um es zu verwirren, erhalten Sie möglicherweise eine relogin1-> relogin2-> ajax1-> ajax2-Sequenz, wobei ajax1 in der falschen Sitzung erstellt wird. Umgehen Sie dies, indem Sie AJAX-Anmeldeanforderungen auf ein Array übertragen und dann speichern und vor dem Ausgeben einer neuen Anmeldeanforderung alle aktuellen Anforderungen abbrechen.
Das letzte Problem, auf das Sie achten müssen, sind Fensteraktualisierungen. Wenn jemand das Fenster aktualisiert, während eine AJAX-Anmeldeanforderung aktiv, aber nicht abgeschlossen ist, wird es im Namen der falschen Person aktualisiert. In diesem Fall können Sie das nicht standardmäßige Ereignis "Beforeunload" verwenden, um den Benutzer vor einer möglichen Verwechslung zu warnen und ihn aufzufordern, auf "Abbrechen" zu klicken, während eine AJAX-Anmeldeanforderung erneut ausgegeben wird. Die einzige Möglichkeit, dies zu verpfuschen, besteht darin, vor Abschluss der Anforderung auf OK zu klicken (oder versehentlich die Eingabetaste / Leertaste zu drücken, da OK - leider für diesen Fall - die Standardeinstellung ist). Es gibt andere Möglichkeiten, diesen Fall zu behandeln, z Erkennen von Drücken von F5 und Strg + R / Alt + R, was in den meisten Fällen funktioniert, jedoch durch Neukonfiguration der Tastenkombination oder alternative Verwendung des Betriebssystems vereitelt werden kann. Dies ist jedoch in der Realität ein Randfall. und die Worst-Case-Szenarien sind nie so schlimm: In einer Honor-System-Konfiguration würden Sie als falsche Person angemeldet sein (aber Sie können deutlich machen, dass dies der Fall ist, indem Sie Seiten mit Farben, Stilen, prominent angezeigten Namen personalisieren, etc.); In einer Kennwortkonfiguration liegt die Verantwortung bei der letzten Person, die ihr Kennwort eingegeben hat, um sich abgemeldet oder ihre Sitzung freigegeben zu haben. Wenn diese Person tatsächlich der aktuelle Benutzer ist, liegt kein Verstoß vor.
Am Ende haben Sie jedoch eine Anwendung für einen Benutzer pro Registerkarte, die (hoffentlich) genau so funktioniert, wie sie sollte, ohne dass Sie unbedingt Profile einrichten, den IE verwenden oder URLs neu schreiben müssen. Stellen Sie jedoch sicher, dass Sie auf jeder Registerkarte deutlich machen, wer auf dieser Registerkarte angemeldet ist.