使用Express.js,会话非常简单。我很好奇它们实际上是如何工作的。
它是否在客户端上存储了一些cookie?如果是这样,我在哪里可以找到那个cookie?如果需要,我如何解码它?
我基本上希望能够看到用户是否登录了,即使用户当时并不在网站上(就像当你在其他网站上时facebook是如何知道你已经登录的)。但是我想我应该首先理解会话是如何工作的。
发布于 2012-07-21 03:31:55
概述
Express.js使用cookie在用户的浏览器中存储会话id (带有加密签名),然后在后续请求时,使用该cookie的值检索存储在服务器上的会话信息。此服务器端存储可以是内存存储(默认)或实现所需方法的任何其他存储(如connect-redis)。
详细信息
in /Connect使用utils.uid(24)
创建24个字符的Base64字符串,并将其存储在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。
https://stackoverflow.com/questions/5522020
复制相似问题