2016-04-10 10 views
0

Mit sails.js gibt es eine Möglichkeit, eine Funktion auszuführen, wenn eine Benutzersitzung abläuft oder beendet ist? Einige Konfiguration in config/session.js tun?Ausführen von Code, wenn eine Sitzung in sails.js endet

Ich weiß existiert session.destroy, die Sie eine Funktion festlegen können ausgeführt werden, wenn die Sitzung zerstört wird, aber ich brauche es eine globale eindeutige Funktion für die Anwendung.

Die Idee wäre, in der db-Tabelle den Zustand eines Benutzers als offline zu schreiben, wenn die Sitzung endet.

Danke.

Antwort

1

Wenn Sie fragen, ob es eine Möglichkeit gibt zu sehen, ob die Sitzung eines Benutzers abgelaufen ist -

Ja! Dies hängt davon ab, wie Sie die serverseitige Komponente der Sitzung speichern. Denken Sie daran, dass herkömmliche Sitzungen 2 Teile benötigen, um korrekt zu funktionieren - etwas auf der Clientseite (ein Cookie zum Beispiel) und etwas auf der Serverseite, um sich an den Benutzer zu erinnern. In Sails wird das Server-Side-Stück in dem Datenspeicher gespeichert, der in dem adapter-Teil der Session Config File angegeben wird. Sie können diesen Datenspeicher abfragen (selbst wenn es sich um den Standardspeicher handelt) und nach allen Benutzern suchen, die abgelaufene Sitzungen haben.

tiefer gehen ...

Wenn Sie sich fragen, ob es eine spezielle Methode, die aufgerufen wird, wenn eine Benutzersitzung abläuft, dann nein, das ist nicht die Art und Weise Sitzungen arbeiten. Sitzungen sind ein "Hack", um HTTP stateful zu machen. Sie sind keine aktive/lebende Sache in der Art, dass wenn sie sterben, wir benachrichtigt werden. Eine Sitzung ist nur ein Datensatz (wahrscheinlich eine Datenbank) mit einem langen Code und einem Datum. Wenn der Nutzer Ihre Website besucht, gibt er Ihnen einen Code von seinem Cookie und Sie verifizieren mit dem Datensatz in Ihrer Sitzungsdatenbank. Wenn der Datensatz übereinstimmt und nicht abgelaufen ist, HURRA! Sie wissen wer sie sind und sie setzen ihre Anfrage fort. Wenn der Datensatz nicht übereinstimmt oder abgelaufen ist, fordert BOO! Sie auf, sich erneut anzumelden.

Wirklich voreilige Schlüsse zu ziehen jetzt ...

ich aus dem letzten Satz nehme an, dass Sie suchen, um zu versuchen, jemand zu überwachen, ob angemeldet ist „aktiv“ Benutzer zu verfolgen. Ich würde vorschlagen, dass Sitzungen ein schlechtes Maß dafür sind. Mit Sitzungen kann ich mich auf Ihrer Website anmelden und dann verlassen. Abhängig von der Länge Ihres Sitzungsablaufs (24 Stunden oder 30 Tage sind typische Werte) würde ich für die gesamte Zeit als eingeloggt angezeigt werden. Ist das eine wirklich hilfreiche Metrik? Ich benutze nicht Ihre Website, aber Sie zeigen mich als "eingeloggt" an. Außerdem könnte ich auf einem anderen Gerät (Telefon oder einem anderen Browser) zurückkommen und ich müsste mich wieder einloggen. Jetzt habe ich 2 oder mehr Sitzungen. Welches ist korrekt?

Wenn Sie versuchen, die aktive Nutzung zu beurteilen, würde ich entweder Websockets verwenden (sie würden Ihnen genau sagen, wann jemand eine Verbindung zu einer Ihrer Seiten hat - read more here) oder einfach einen "Herzschlag" - jedes Mal ein Benutzer besucht eine Ihrer Seiten, die als last seen at erfasst wurde. Dies gibt Ihnen eine ungefähre Einschätzung, wer aktiv auf der Website ist und wer nicht, sagen wir, über eine Stunde getan hat.

+0

Ich habe mir Zeit genommen, Optionen zu analysieren. WebSockets können eine Verbindungs-/Verbindungsunterbrechung melden, aber das Problem tritt auf, wenn ein Benutzer einer Seite beitritt und eine Seite verlässt, egal wie (z. B. durch Klicken auf einen Link). Ich beschloss, den Server alle 1 Minute zu pingen (mit einer einfachen Ajax-Anfrage). Wenn die Serverzeitdifferenz vom letzten Ping mehr als 5 Minuten beträgt, wird ein Benutzer als offline betrachtet. Danke für deine ausführliche Antwort. – dovahkiin

+0

Sie sind genau richtig. Große einfache Lösung @dovankiin. Web-Socket-Lösungen funktionieren besser in einer Rich-JavaScript-Webanwendung wie Angular, wo Sie erwarten können, dass sich der Benutzer auf derselben "Seite" befindet, damit Sie den Session-Socket verwalten können. – mwielbut

0

Sie können dies tun, indem das Hinzufügen Politik alle Route zum Beispiel sessionAuth.js zu Richtlinienordnern hinzufügen:

module.exports = function(req, res, next) { 

    // If you are not using passport then set your own logic 
    if (req.session.authenticated) { 
    return next(); 
    } 

    // if you are using passport then 
    if(req.isAuthenticated()) { 
    return next(); 
    } 

    //make your logic if session ends here 
     //** do some thing/


    }; 

diese Zeilen in dem config/policies.js:

module.exports.policies = { 

    '*': 'sessionAuth' 
} 
Verwandte Themen