2016-08-02 23 views
1

Ich habe eine Node/Express Anwendung, die redis als Session-Speicher verwenden.Node/Express mit Connect-Redis, wie behandeln Sitzungsablauf

Ich habe eine Frage bezüglich der Handhabung der Ablauf der Sitzung.

Ich möchte eine aktive Sitzung haben, bis der Browser geschlossen ist, also habe ich keine Sitzungsablaufzeit festgelegt.

Das Session-Cookie funktioniert gut, aber ich habe Zweifel an Redis.

Es scheint, dass das in Redis DB gespeicherte Paar Schlüssel/Wert niemals abläuft.

Wie ist der richtige Weg, damit umzugehen?

Es gibt eine Möglichkeit, redis so zu konfigurieren, dass ein Wert gelöscht wird, der mit einer bestimmten Leerlaufzeit gespeichert wurde.

Oder ist besser eine TTL gesetzt, wenn die connect-redis in der Anwendung aufgerufen wird?


tatsächliche Konfiguration der Sitzung in der Anwendung:

var session = require('express-session'); 
var RedisStore = require('connect-redis')(session); 

app.use(session({ 
    store: new RedisStore({port:6379, host: 'localhost'}), 
    secret: "my-secret-here", 
    resave: false, 
    saveUninitialized: true })); 

Antwort

1

Mit Redis mit Express-Sitzung können Sie die Touch() -Methode von Express-Sitzung verwenden, um die TTL zurücksetzen. Wenn Sie also eine TTL gesetzt, wenn die Sitzung zu schaffen, etwas zu tun, wie dies auf den Strecken, auf denen Sie nicht wollen, die Sitzung ablaufen:

api.get("/someRoute/", (req, res) => { 
    req.session.touch(); 

    // Whatever else you need to do 
    res.sendStatus(200); 
} 

, dass der TTL auf Redis zurückgesetzt wird und verhindern, dass die Sitzung abläuft unter der Annahme, Der Client trifft weiterhin Ihre API. Ich gehe davon aus, dass der Browser geschlossen oder auf andere Weise mit Ihrer App beendet wird, wenn der Client nicht lange genug mit Ihrer API interagiert.

+0

Die Methode touch() setzt cookie.maxAge? Session Cookie hat jedoch keine maxAge gesetzt. Der Cookie läuft ab, wenn der Browser geschlossen wird. Vielleicht könnte ich eine TTL für die Daten in Redis DB und verwenden Sie etwas wie eine store.touch(), um die TTL zu aktualisieren. Das könnte richtig sein? – Zauker

+0

Ich habe versucht, einen Redis-TTL-Wert festzulegen, der von Ihnen vorgeschlagene Befehl req.session.touch() funktioniert einwandfrei. Es aktualisiert die Idletime des in Redis DB gespeicherten Schlüssels. Vielen Dank. – Zauker

1

Sie können beim Erstellen des Sitzungsspeichers ein TTL angeben. Sie können weitere Optionen in der readme finden.

app.use(session({ 
    store: new RedisStore(options), 
    secret: 'keyboard cat', 
    ttl : 20 // ttl is in seconds. From the readme. 
})); 
+0

Ja, ich etwas in der Art. Ich wusste wirklich nicht, wann ich anfangen sollte, aber ich werde es mit anderen Werten versuchen. Wie ist es möglich, die TTL zurückzusetzen? Ich muss req.session.touch() wie von Levi oder etwas wie store.touch() vorgeschlagen verwenden? Ich habe das nicht verstanden. – Zauker

+0

Sie können 'touch' verwenden oder einfach ein ttl setzen und es vergessen. –