2012-04-12 2 views
2

Ich habe eine Tabelle mit einem Feld 'LoginStatus'. Jedesmal, wenn sich ein Benutzer anmeldet, wird der Wert auf 1 gesetzt und nach dem Klicken auf Logout wird der Wert auf 0 gesetzt. Wenn ein Benutzer sich anzumelden versucht, wird der Wert dieses Feldes überprüft. Wenn es 0 ist, kann der Benutzer das tun einloggen, wenn es 1 ist, kann sich der Benutzer nicht anmelden. Wenn nun der Browser geschlossen ist, kann sich der Benutzer nicht mit dieser Benutzerkennung anmelden. Weil der Wert dieses Felds immer noch 1 ist (er hat nicht auf den Abmeldeschalter geklickt, so dass er nicht geändert wird). Meine Anwendung läuft einwandfrei, wenn der Benutzer den Browser nicht schließt.Single-User-Multi-Login-Prävention auf Browser schließen

Ich weiß, dass dieses Problem anders gelöst werden kann, aber ich wurde gebeten, es auf diese Weise zu tun. Jetzt ist das Problem, ich bin nicht so viel Profi in Java EE so mehrere Hilfe mit Erklärungen sind genau das, was ich suche.

Auch ich habe eine mögliche Lösung, die ist wie: Erstellen eines Datenbank-Triggers, um den loginStatus Wert auf 0 zu ändern, die nach, sagen 15 Minuten ausgelöst werden, wenn sich der Benutzer anmeldet. Jetzt weiß ich auch nicht, wie man das erstellt Art des Triggers, der nach einer bestimmten Zeit ausgelöst wird.

Antwort

1

Sie können einen Datenbankjob erstellen, der regelmäßig ausgeführt wird und alte Sitzungen ablaufen lässt. Abhängig von der von Ihnen verwendeten Oracle-Version können Sie entweder das DBMS_JOB-Paket oder das anspruchsvollere DBMS_SCHEDULER-Paket verwenden. DBMS_JOB ist ein älteres Paket, aber für relativ einfache und isolierte Aufgaben wie diese gibt es weniger Lernkurve. Zum Beispiel, wenn Sie eine gespeicherte Prozedur UNLOCK_ACCOUNTS haben, die, wenn sie ausgeführt werden, die sie zu entsperren Konten bestimmt und entsperrt, können Sie DBMS_JOB verwenden, um das Verfahren

DECLARE 
    l_jobno INTEGER; 
BEGIN 
    dbms_job.submit(l_jobno, 
        'BEGIN unlock_accounts; END;', 
        sysdate + interval '15' minute, 
        'sysdate + interval ''15'' minute'); 
    commit; 
END; 

Natürlich alle 15 Minuten zu haben, können Sie auch ein Java-Scheduler (Quartz ist ein beliebter) oder das DBMS_SCHEDULER Paket, um das Gleiche zu tun. Dies erfordert jedoch, dass es irgendwo ein Feld gibt, das den Login-Zeitstempel speichert, so dass die Prozedur UNLOCK_ACCOUNTS herausfinden kann, welche Logins vor mehr als 15 Minuten passiert sind.

Im Allgemeinen ist diese gesamte Architektur jedoch eher suspekt. Es ist ziemlich merkwürdig, dass eine webbasierte Anwendung (die von Natur aus zustandslos ist) eine Anmeldung verweigern möchte, weil der Benutzer zu einem früheren Zeitpunkt einen anderen Browser geöffnet hat. Es ist relativ üblich, Sitzungen auszusetzen, wenn sie eine Zeit lang aus Sicherheitsgründen inaktiv waren, aber 15 Minuten sind im Allgemeinen viel zu kurz für diese Art von Dingen - selbst Bankwebsites erlauben es im Allgemeinen, länger untätig zu bleiben. Und dieser Ansatz verhindert nicht einmal, dass Sie gleichzeitig von mehreren Browsern/Computern aus angemeldet sind, solange die Logins mehr als 15 Minuten auseinander liegen.

2

Wenn Sie diese Anforderung erzwungen haben, können Sie Konten automatisch ablaufen lassen, ohne einen Auftrag ausführen zu müssen.

Anstelle eines einfachen "Ein/Aus" -Flags muss ein Datums-/Zeitstempel auf der Tabelle stehen, der auf das aktuelle Datum/die aktuelle Uhrzeit eingestellt ist. Hin und wieder, wenn der Benutzer den Server mit einer Anfrage schlägt, würden Sie diese Spalte auf die aktuelle Zeit aktualisieren.

Wenn eine zweite Sitzung versucht, sich anzumelden, sollte diese Sitzung das Datum/den Zeitstempel auf der Tabelle überprüfen, und wenn es vor mehr als 15 Minuten ist, ist die Anmeldung erlaubt; Sonst ist es blockiert.

Verwandte Themen