Jak zakończyć sesję w ExpressJS


88

Czuję, że trzeba to gdzieś zakopać w dokumentacji, ale nie mogę tego znaleźć.

Jak zamknąć, zakończyć lub zabić (cokolwiek) sesję w ExpressJS?

Odpowiedzi:


122

Express 4.x Zaktualizowana odpowiedź

Obsługa sesji nie jest już wbudowana w Express. Ta odpowiedź odnosi się do standardowego modułu sesji: https://github.com/expressjs/session

Aby wyczyścić dane sesji, po prostu użyj:

req.session.destroy();

Dokumentacja jest w tym trochę bezużyteczna. To mówi:

Niszczy sesję, usuwa req.session, zostanie ponownie wygenerowane następne żądanie. req.session.destroy(function(err) { // cannot access session here })

Ten sposób nie oznacza, że bieżąca sesja zostanie ponownie załadowany na następne żądanie. Oznacza to, że przy następnym żądaniu w Twoim magazynie sesji zostanie utworzona czysta, pusta sesja. (Prawdopodobnie identyfikator sesji się nie zmienia, ale nie testowałem tego).


czy istnieje sposób na usunięcie sesji z sesji, a nie natychmiastowego żądania. Na przykład, gdybym miał zaimplementować, wyloguj mnie ze wszystkich funkcji urządzeń, potrzebowałbym tego
Muhammad Umer

1
@MuhammadUmer O ile wiem, nie ma wbudowanego mechanizmu niszczenia arbitralnej sesji. Możesz to łatwo zaimplementować samodzielnie, usuwając klucze związane z sesją z pamięci lub tworząc własne opakowanie sesji.
Brad

93

Nieważne, to jest req.session.destroy();


8
To nie działa dla mnie w Express 3 .. Próbuję wywołać ´req.session.destroy () ´
acidghost

6
Działa dobrze dla mnie na ExpressJS 3.00. Używany req.session.destroy();jako acidghost.
heksacyjanid

1
użycie req.session.destroy () działa również u mnie w express 2.5
TulioPa

1
Gdzie to jest udokumentowane? Próbuję to znaleźć.
przytulanie

25

Pytanie nie wyjaśniało, jaki typ magazynu sesji był używany. Obie odpowiedzi wydają się prawidłowe.

W przypadku sesji opartych na plikach cookie:

Z http://expressjs.com/api.html#cookieSession

req.session = null // Deletes the cookie.

W przypadku sesji opartych na Redis itp .:

req.session.destroy // Deletes the session in the database.

1
req.session.destroy jest w istocie opakowaniem dla „delete req.session”, zobacz kod źródłowy tutaj: github.com/expressjs/session/blob/master/session/session.js
tfmontague


6

posługiwać się,

delete req.session.yoursessionname;

Naprawdę chciałbym zobaczyć dokument na ten temat.
Leniwy

5
Dla wszystkich, którzy głosują w dół @Nithin; metoda funkcji session.destroy (), jak udokumentowano na github (github.com/expressjs/session/blob/master/session/session.js) używa „delete this.req.session” - nie jest to dokładnie odpowiedź @ Nithin, ale użycie opcji „usuń” jest również poprawnym rozwiązaniem (i nie zostało uwzględnione w innych odpowiedziach).
tfmontague

Czy to jest właściwe rozwiązanie? Żadnego wycieku pamięci, nic złego się nie wydarzy, prawda?
Rajath


5

Session.destroy (wywołanie zwrotne)

Niszczy sesję i usuwa właściwość req.session. Po zakończeniu wywołanie zwrotne zostanie wywołane.

Bezpieczny sposób ↓ ✅

req.session.destroy((err) => {
  res.redirect('/') // will always fire after session is destroyed
})

Niezabezpieczony sposób ↓ ❌

req.logout();
res.redirect('/') // can be called before logout is done

0
req.session.destroy(); 

Powyższe nie zadziałało, więc zrobiłem to.

req.session.cookie.expires = new Date().getTime();

Ustawiając datę wygaśnięcia pliku cookie na aktualny czas, sesja wygasła sama.


-5

Jak wspomniano w kilku miejscach, nie jestem również w stanie zmusić funkcji req.session.destroy () do prawidłowego działania.

To jest moja obejście ... wydaje się działać i nadal pozwala na użycie req.flash

req.session = {};

Jeśli usuniesz lub ustawisz req.session = null; , wygląda na to, że nie możesz użyć req.flash


1
Jest to kwestia bezpieczeństwa, ponieważ nie zmienia ona wartości skrótu sesji
Tosh,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.