Come terminare una sessione in ExpressJS


89

Sento che questo deve essere sepolto da qualche parte nella documentazione, ma non riesco a trovarlo.

Come si chiude o si termina o si uccide (qualunque cosa) una sessione in ExpressJS?

Risposte:


125

Risposta aggiornata di Express 4.x

La gestione delle sessioni non è più integrata in Express. Questa risposta si riferisce al modulo di sessione standard: https://github.com/expressjs/session

Per cancellare i dati della sessione, usa semplicemente:

req.session.destroy();

La documentazione è un po 'inutile su questo. Dice:

Distrugge la sessione, rimuovendo req.session, verrà rigenerata la prossima richiesta. req.session.destroy(function(err) { // cannot access session here })

Ciò non significa che la sessione corrente verrà ricaricata alla richiesta successiva. Significa che una sessione vuota pulita verrà creata nel tuo session store alla prossima richiesta. (Presumibilmente l'ID della sessione non cambia, ma non l'ho testato.)


c'è un modo per distruggere la sessione dalle sessioni e non dalla richiesta immediata. Ad esempio, se dovessi implementare la funzionalità di disconnessione da tutti i dispositivi ne avrei bisogno
Muhammad Umer,

1
@MuhammadUmer Per quanto ne so, non esiste un meccanismo integrato per distruggere una sessione arbitraria. È possibile implementarlo facilmente eliminando le chiavi associate alla sessione dalla memoria o creando il proprio wrapper di sessione.
Brad

94

Non importa, lo è req.session.destroy();


8
Questo non funziona per me su express 3 .. Sto cercando di chiamare ´req.session.destroy () ´
acidghost

6
Funziona bene per me su ExpressJS 3.00. Usato req.session.destroy();come Acidghost.
esacianide

1
l'uso di req.session.destroy () funziona anche per me in express 2.5
TulioPa

1
Dove è documentato? Sto cercando di trovarlo.
huggie

25

La domanda non chiariva quale tipo di archivio sessioni fosse utilizzato. Entrambe le risposte sembrano essere corrette.

Per le sessioni basate sui cookie:

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

req.session = null // Deletes the cookie.

Per sessioni basate su Redis, ecc .:

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

1
req.session.destroy è essenzialmente un wrapper per "delete req.session", vedere il codice sorgente qui: github.com/expressjs/session/blob/master/session/session.js
tfmontague


7

uso,

delete req.session.yoursessionname;

Mi piacerebbe davvero vedere un documento su questo.
Pigro

5
Per tutti coloro che votano per difetto @Nithin; il metodo-funzione session.destroy () come documentato su github (github.com/expressjs/session/blob/master/session/session.js) usa "delete this.req.session" - non è esattamente la risposta di @ Nithin, ma anche l'uso di "cancella" è una soluzione corretta (e non viene trattata in altre risposte).
tfmontague

Questa è la soluzione giusta? Nessuna perdita di memoria, qualcosa di malizioso non succederà giusto?
Rajath

6

Session.destroy (richiamata)

Distrugge la sessione e annulla la proprietà req.session. Una volta completato, verrà richiamato il callback.

Modo sicuro ↓ ✅

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

Modo non sicuro ↓ ❌

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

5

Utilizzando req.session = null;, non verrà effettivamente eliminata l'istanza della sessione. La soluzione più appropriata sarebbe req.session.destroy();, ma questo è essenzialmente un wrapper perdelete req.session; .

https://github.com/expressjs/session/blob/master/session/session.js

Session.prototype.destroy = function(fn){
  delete this.req.session;
  this.req.sessionStore.destroy(this.id, fn);
  return this;
};

0
req.session.destroy(); 

Quanto sopra non ha funzionato per me, quindi l'ho fatto.

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

Impostando la scadenza del cookie sull'ora corrente, la sessione è scaduta da sola.


-5

Come accennato in diversi punti, non sono nemmeno in grado di far funzionare correttamente la funzione req.session.destroy ().

Questo è il mio lavoro intorno .. sembra fare il trucco, e consente ancora di utilizzare req.flash

req.session = {};

Se elimini o imposti req.session = null; , sembra che non sia possibile utilizzare req.flash


1
Si tratta di un problema di sicurezza, poiché non modifica l'hash della sessione
Tosh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.