Como terminar uma sessão no ExpressJS

88

Acho que isso deve estar enterrado em algum lugar da documentação, mas não consigo encontrar.

Como você fecha, encerra ou mata (seja o que for) uma sessão no ExpressJS?

Stephen
fonte

Respostas:

121

Resposta atualizada do Express 4.x

O tratamento de sessão não está mais embutido no Express. Esta resposta se refere ao módulo de sessão padrão: https://github.com/expressjs/session

Para limpar os dados da sessão, basta usar:

req.session.destroy();

A documentação é um pouco inútil nisso. Diz:

Destrói a sessão, removendo req.session, será gerado novamente na próxima solicitação. req.session.destroy(function(err) { // cannot access session here })

Isso não significa que a sessão atual será recarregada na próxima solicitação. Isso significa que uma sessão limpa e vazia será criada em seu armazenamento de sessão na próxima solicitação. (Presumivelmente, o ID da sessão não está mudando, mas não testei isso.)

Brad
fonte
existe uma maneira de destruir a sessão das sessões e não da solicitação imediata. Por exemplo, se eu fosse implementar a funcionalidade de logoff de todos os dispositivos, eu precisaria disso
Muhammad Umer
1
@MuhammadUmer Pelo que eu sei, não existe um mecanismo embutido para destruir uma sessão arbitrária. Você pode implementar isso facilmente, excluindo do armazenamento as chaves associadas à sessão ou criando seu próprio wrapper de sessão.
Brad
92

Deixa pra lá, é req.session.destroy();

Stephen
fonte
8
Isso não está funcionando para mim no expresso 3 .. Estou tentando ligar para ´req.session.destroy () ´
acidghost
6
Está funcionando bem para mim no ExpressJS 3.00. Usado req.session.destroy();como acidghost.
hexacianida
1
o uso de req.session.destroy () também funciona para mim no expresso 2.5
TulioPa
1
Onde isso está documentado? Estou tentando encontrar.
abraço de
24

A pergunta não esclareceu que tipo de armazenamento de sessão estava sendo usado. Ambas as respostas parecem estar corretas.

Para sessões baseadas em cookies:

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

req.session = null // Deletes the cookie.

Para sessões baseadas em Redis, etc:

req.session.destroy // Deletes the session in the database.
Blueshirts
fonte
1
req.session.destroy é essencialmente um wrapper para "delete req.session", consulte o código-fonte aqui: github.com/expressjs/session/blob/master/session/session.js
tfmontague
6

usar,

delete req.session.yoursessionname;
Nithin
fonte
Eu realmente gostaria de ver um documento sobre isso.
Preguiçoso,
5
Para todos aqueles que votaram contra @Nithin; o método de função session.destroy () documentado no github (github.com/expressjs/session/blob/master/session/session.js) usa "delete this.req.session" - não é exatamente a resposta do @Nithin, mas usar "deletar" também é uma solução correta (e não abordada em outras respostas).
tfmontague
Esta é a solução adequada? Sem vazamento de memória, qualquer coisa perniciosa não vai acontecer certo?
Rajath
5

Usar req.session = null;, não excluirá realmente a instância da sessão. A solução mais adequada seria req.session.destroy();, mas este é essencialmente um invólucro paradelete 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;
};
tfmontague
fonte
4

Session.destroy (callback)

Destrói a sessão e removerá a definição da propriedade req.session. Depois de concluído, o retorno de chamada será invocado.

↓ Caminho seguro ↓ ✅

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

Caminho inseguro ↓ ❌

req.logout();
res.redirect('/') // can be called before logout is done
Hasan Sefa Ozalp
fonte
0
req.session.destroy(); 

O acima não funcionou para mim, então eu fiz isso.

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

Ao definir a expiração do cookie para a hora atual, a sessão expirou sozinha.

John Quasar
fonte
-5

Conforme mencionado em vários lugares, também não consigo fazer a função req.session.destroy () funcionar corretamente.

Esta é a minha solução ... parece funcionar, e ainda permite que req.flash seja usado

req.session = {};

Se você excluir ou definir req.session = null; , parece que você não pode usar req.flash

Gene Bo
fonte
1
Este é um problema de segurança, uma vez que não altera o hash da sessão
Tosh