gpt4 book ai didi

javascript - session 如何在 Express.js 和 Node.js 中工作?

转载 作者:IT老高 更新时间:2023-10-28 21:48:14 28 4
gpt4 key购买 nike

使用 Express.js , session 非常简单。不过我很好奇它们实际上是如何工作的。

它会在客户端上存储一些 cookie 吗?如果是这样,我在哪里可以找到那个 cookie?如果需要,如何解码?

我基本上希望能够查看用户是否已登录,即使当时该用户实际上并未在网站上(例如当您在其他网站上时 facebook 如何知道您已登录)。但我想了解我应该首先了解 session 是如何工作的。

最佳答案

概述

Express.js 使用 cookie 将 session ID(带有加密签名)存储在用户的浏览器中,然后在后续请求中,使用该 cookie 的值来检索存储在服务器上的 session 信息。此服务器端存储可以是内存存储(默认)或任何其他实现所需方法的存储(如 connect-redis)。

详情

Express.js/Connect 创建一个 24 个字符的 Base64使用 utils.uid(24) 的字符串并将其存储在 req.sessionID 中。然后将该字符串用作 cookie 中的值。

客户端

签名 cookie 总是用于 session ,因此 cookie 值将具有以下格式。

[sid].[signature]

其中 [sid] 是 sessionID,[signature] 是通过使用初始化 session 中间件时提供的 key 对 [sid] 进行签名生成的。签名步骤是为了防止篡改。在不知道使用的 key 的情况下修改 [sid] 然后重新创建 [签名] 在计算上应该是不可行的。如果不需要修改 [sid], session cookie 仍然容易被盗用和重复使用。

这个cookie的名字是

connect.sid

服务器端

如果处理程序出现在 cookieParsersession 中间件之后,它将可以访问变量 req.cookies。这包含一个 JSON 对象,其键是 cookie 键,值是 cookie 值。这将包含一个名为 connect.sid 的 key ,其值将是签名的 session 标识符。

下面是一个如何设置路由的示例,该路由将在每个请求上检查 session cookie 的存在并将其值打印到控制台。

app.get("/*", function(req, res, next) {

if(typeof req.cookies['connect.sid'] !== 'undefined') {
console.log(req.cookies['connect.sid']);
}

next(); // Call the next middleware
});

您还需要确保在 cookieParsersession 之后包含路由器 (app.use(app.router))在您的配置部分。

以下是 Express.js/Connect 内部存储的数据示例。

{
"lastAccess": 1343846924959,
"cookie": {
"originalMaxAge": 172800000,
"expires": "2012-08-03T18:48:45.144Z",
"httpOnly": true,
"path": "/"
},
"user": {
"name":"waylon",
"status":"pro"
}
}

user 字段是自定义的。其他一切都是 session 管理的一部分。

示例来自 Express 2.5。

关于javascript - session 如何在 Express.js 和 Node.js 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5522020/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com