服务器重新启动时如何在节点 js 中保持持久会话?

Posted

技术标签:

【中文标题】服务器重新启动时如何在节点 js 中保持持久会话?【英文标题】:how to maintain persistent session in node js when server restarts? 【发布时间】:2016-01-08 10:04:38 【问题描述】:

据我研究,到目前为止,*** 的答案是关于在服务器重启后使会话保持不变。

我考虑用 4 种可能的方式来处理我的平均应用程序。

    cookie-会话https://www.npmjs.com/package/cookie-session 使用 Json Web 令牌 (JWT) https://www.npmjs.com/package/jsonwebtoken 使用 connect-mongo/connect-redis passport.js

现在我怀疑我是否会在 mongo 和 redis 中重新启动我的服务器。 session 仍然存在,因为它们是外部数据存储。 但是如何使用 JWT 和 cookie 会话使我的会话持久化。 这些会话变量存储在哪里。

对于passport.js,我遇到的解决方案是使会话持久化是将会话数据存储在connect-mongo/connect-redis中。

护照中有没有其他方法可以使会话持久化?

【问题讨论】:

【参考方案1】:

如果您将会话存储在外部存储中,则重新启动后它应该可用。

Passport 不对会话负责。您可以独立于通行证设置会话。 Passport 是具有使用会话策略的身份验证中间件。 你设置了快速会话:

app.use(express.session(session options));

然后你初始化并设置护照以使用会话:

app.use(passport.initialize());
app.use(passport.session());

表示不管你是否使用passport,session配置都是一样的。

有几种方法可以使会话持久化: 它们中的大多数将会话存储在数据库或文件系统中(内存存储仅适用于开发环境)。请看这个 npm 搜索列表link。

来自官方快速会话页面https://github.com/expressjs/session#compatible-session-stores的兼容会话存储列表

如果正确实施,Jwt 令牌是无状态的。这意味着您的服务器不存储任何会话数据,它不知道有多少会话有效。如果它有有效的 jwt 令牌,它会授权请求。

Jwt 令牌可以存储一些数据,例如您的用户 ID。当您的服务器收到令牌时,它会对其进行解码并验证,然后您就可以访问此令牌中的数据。请阅读这篇文章了解更多详情:

https://stormpath.com/blog/jwt-the-right-way/

最重要的部分(还有更重要的东西,但有时会被遗忘):

在您信任 JWT 中的任何信息之前始终验证签名

和:

不要在 JWT 中包含任何敏感数据

维护jwt请看这个模块:

https://www.npmjs.com/package/json-web-token

甚至对于一些混合解决方案模块(使用 jwt 令牌的 redis 会话):

https://www.npmjs.com/package/jwt-redis-session

【讨论】:

感谢您的回答,我也听说过 memcached npmjs.com/package/memcached 我的问题是 memcached 比 redis 快吗?如果是这样,您会建议考虑所有利弊?? 是内存存储。因此它应该更快,但会话数据不是持久的。看看这个答案(它是关于 php 但这种情况类似)***.com/a/13946349/4138339 我编辑帖子并添加此链接:github.com/expressjs/session#compatible-session-stores 有类似问答***.com/questions/33057811/…

以上是关于服务器重新启动时如何在节点 js 中保持持久会话?的主要内容,如果未能解决你的问题,请参考以下文章

与护照、mongodb 和 express 的持久会话

即使在单独的游戏会话之后,我如何保持变量的一致性?

地理位置保持浏览器会话持久

NodeJS redis 连接会话 ID 在应该保持不变时重新生成

MVC 4:如何在 IIS 重启后保持会话和 cookie 仍然有效?

服务器断开连接后如何在 Spring MVC 中保持客户端会话处于活动状态