如何在 ExpressJS 中结束会话

Posted

技术标签:

【中文标题】如何在 ExpressJS 中结束会话【英文标题】:How to end a session in ExpressJS 【发布时间】:2011-07-31 04:53:33 【问题描述】:

我觉得这必须隐藏在文档中的某个地方,但我找不到它。

如何在 ExpressJS 中关闭、结束或终止(无论如何)会话?

【问题讨论】:

【参考方案1】:

没关系,我是req.session.destroy();

【讨论】:

这在 express 3 上对我不起作用。我正在尝试调用 ´req.session.destroy()´ 在 ExpressJS 3.00 上工作正常。像 acidghost 一样使用req.session.destroy(); 在 express 2.5 中使用 req.session.destroy() 也适用于我 这是在哪里记录的?我正在寻找它。【参考方案2】:

使用,

delete req.session.yoursessionname;

【讨论】:

我真的很想看到一个关于这个的文件。 对于所有反对@Nithin 的人; github (github.com/expressjs/session/blob/master/session/session.js) 上记录的 session.destroy() 函数方法使用“删除 this.req.session” - 这不完全是@Nithin 的答案,但是使用“删除”也是一个正确的解决方案(其他答案未涵盖)。 这是正确的解决方案吗?没有内存泄漏,不会发生什么恶作剧吧?【参考方案3】:

来自http://expressjs.com/api.html#cookieSession

要清除 cookie,只需在响应之前将会话分配为 null:

req.session = null

【讨论】:

【参考方案4】:

该问题没有说明正在使用哪种类型的会话存储。两个答案似乎都是正确的。

对于基于 cookie 的会话:

来自http://expressjs.com/api.html#cookieSession

req.session = null // Deletes the cookie.

对于基于 Redis 等的会话:

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

【讨论】:

req.session.destroy 本质上是“删除 req.session”的包装器,请参阅此处的源代码:github.com/expressjs/session/blob/master/session/session.js【参考方案5】:

结束服务器端会话

https://github.com/expressjs/session#sessiondestroycallback

req.session.destory();

注意,这本质上是对delete 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;
;

结束 cookie 会话

https://github.com/expressjs/cookie-session#destroying-a-session

req.session = null;

【讨论】:

【参考方案6】:

Express 4.x 更新答案

会话处理不再内置于 Express 中。这个答案指的是标准会话模块:https://github.com/expressjs/session

要清除会话数据,只需使用:

req.session.destroy();

文档在这方面有点没用。它说:

销毁会话,删除req.session,下次请求会重新生成。 req.session.destroy(function(err) // cannot access session here )

意味着当前会话将在下一个请求时重新加载。这意味着下次请求时将在您的会话存储中创建一个干净的空会话。 (大概会话 ID 没有改变,但我没有测试过。)

【讨论】:

有没有办法从会话中销毁会话而不是立即请求。例如,如果我要实现让我退出所有设备功能,我将需要该功能 @MuhammadUmer 据我所知,没有用于销毁任意会话的内置机制。您可以通过从存储中删除与会话关联的密钥或创建自己的会话包装器来轻松实现这一点。【参考方案7】:

正如在几个地方提到的,我也无法让 req.session.destroy() 函数正常工作。

这是我的解决方法 .. 似乎可以解决问题,并且仍然允许使用 req.flash

req.session = ;

如果你删除或设置 req.session = null; ,那么你似乎不能使用 req.flash

【讨论】:

这是一个安全问题,因为它不会改变会话哈希【参考方案8】:
req.session.destroy(); 

以上对我不起作用,所以我这样做了。

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

通过将cookie的过期时间设置为当前时间,会话自行过期。

【讨论】:

【参考方案9】:

Session.destroy(callback)

销毁会话并取消设置 req.session 属性。完成后,将调用回调。

安全方式 ↓ ✅

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

不安全的方式 ↓ ❌

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

【讨论】:

如果我有闪存怎么办,因为它会导致错误(这很明显)。 | UnhandledPromiseRejectionWarning:错误:req.flash() 需要会话 在这种情况下,我认为您可以使用req.user = 。我记得password.js 使用req.user 来跟踪登录用户。【参考方案10】:

您可以使用req.session.idreq.sessionID 检索会话的ID,然后将其传递给req.sessionStore.destroy 方法,如下所示:

const sessionID = req.session.id;
req.sessionStore.destroy(sessionID, (err) => 
  // callback function. If an error occurs, it will be accessible here.
  if(err)
    return console.error(err)
  
  console.log("The session has been destroyed!")
)

Reference to the req.sessionStore.destroy method.

【讨论】:

以上是关于如何在 ExpressJS 中结束会话的主要内容,如果未能解决你的问题,请参考以下文章

ExpressJS & Websocket & 会话共享

使用带有 expressjs 的 multer 上传文件时的错误处理

如何在 Informatica 中捕获会话结束时间

PassportJS 中的会话如何协同工作

如何拦截会话结束并获取属性?

在 Cookie 中存储 Express 会话