使用Express.js,会话非常简单。我很好奇它们实际上是如何工作的。
它会在客户端上存储一些cookie吗?如果是这样,我在哪里可以找到该Cookie?如果需要,如何解码?
我基本上希望能够查看用户是否登录,即使该用户当时实际上不在该站点上(例如,当您在其他站点上时,facebook如何知道您已登录)。但是我想了解的是,我应该首先了解会议的工作方式。
使用Express.js,会话非常简单。我很好奇它们实际上是如何工作的。
它会在客户端上存储一些cookie吗?如果是这样,我在哪里可以找到该Cookie?如果需要,如何解码?
我基本上希望能够查看用户是否登录,即使该用户当时实际上不在该站点上(例如,当您在其他站点上时,facebook如何知道您已登录)。但是我想了解的是,我应该首先了解会议的工作方式。
Answers:
我从未使用过Express.js,尽管根据他们关于该主题的文档,听起来像是:
Cookie存储在客户端上,带有一个密钥(服务器将使用该密钥来检索会话数据)和一个哈希(服务器将使用该哈希来确保cookie数据未被篡改,因此,如果您尝试更改) Cookie的值无效)
与某些框架(例如Play Framework!)相反,会话数据保存在服务器上,因此cookie更像是会话的占位符,而不是实际会话数据的持有者。
从这里开始,服务器上的该会话数据看起来默认情况下保存在内存中,尽管可以将其更改为实现适当API的任何存储形式。
因此,如果您想在没有特定req
请求对象的情况下进行检查,如您所说,则只需访问相同的存储即可。在第一个文档页面的底部,它详细说明了存储需要实现的必需方法,因此,如果您熟悉存储API,也许您可以执行.getAll()
类似的操作,并遍历会话数据并读取任何内容。您想要的值。
Express.js使用cookie将会话ID(带有加密签名)存储在用户的浏览器中,然后,在后续请求中,使用该cookie的值来检索存储在服务器上的会话信息。该服务器端存储可以是内存存储(默认),也可以是实现所需方法的任何其他存储(例如connect-redis)。
Express.js / Connect使用创建一个24个字符的Base64字符串utils.uid(24)
并将其存储在中req.sessionID
。然后将此字符串用作cookie中的值。
签名的cookie始终用于会话,因此cookie值将具有以下格式。
[sid].[signature]
其中[sid]是sessionID,[签名]是通过使用初始化会话中间件时提供的密钥对[sid]进行签名来生成的。完成签名步骤是为了防止篡改。在不知道所使用的秘密密钥的情况下,修改[sid]然后重新创建[签名]应该在计算上不可行。如果不需要修改[sid],则会话cookie仍然容易被盗窃和重用。
该Cookie的名称是
connect.sid
如果在cookieParser
和session
中间件之后出现处理程序,它将可以访问该变量req.cookies
。它包含一个JSON对象,其键是cookie键,值是cookie值。这将包含一个名为的密钥connect.sid
,其值将为签名的会话标识符。
这是一个如何设置路由的示例,该路由将检查每个请求上是否存在会话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
});
您还需要确保在配置部分app.use(app.router)
之后cookieParser
和session
中包含路由器()。
以下是Express.js / Connect内部存储的数据的示例。
{
"lastAccess": 1343846924959,
"cookie": {
"originalMaxAge": 172800000,
"expires": "2012-08-03T18:48:45.144Z",
"httpOnly": true,
"path": "/"
},
"user": {
"name":"waylon",
"status":"pro"
}
}
该user
字段是自定义的。其他所有内容都是会话管理的一部分。
该示例来自Express 2.5。
我很好奇它们实际上是如何工作的。
它会在客户端上存储一些cookie吗?
是的,它通常是具有分配的会话ID的cookie,为了防止伪造,应该使用秘密对其进行签名。
如果是这样,我在哪里可以找到该Cookie?如果需要,如何解码?
您不应该在客户端使用会话cookie。如果要在服务器端使用会话,则应签出相关的express.js并连接文档。