Node.js如何在Express.js中工作?
使用Express.js ,会话非常简单。 我很好奇他们是如何工作的。
它是否在客户端存储一些cookie? 如果是这样,我在哪里可以find该cookie? 如果需要,我该如何解码?
我基本上希望能够看到用户是否login,即使当时用户并不真正在网站上(例如,如果Facebook知道您在其他网站上login时如何login)。 但我想明白,我应该先了解会议的工作。
我从来没有使用Express.js,虽然根据他们关于这个问题的文档 ,它听起来像:
-
Cookies存储在客户端,一个密钥(服务器将用来检索会话数据)和一个散列(服务器将用来确保cookie数据没有被篡改,所以如果你试图改变cookie的值将是无效的)
-
会话数据,而不是一些框架(例如Play Framework !)被保存在服务器上,所以cookie比持有实际会话数据更像会话的占位符。
-
从这里看,服务器上的这个会话数据看起来像默认保存在内存中,尽pipe可以改变为实现适当的API的任何存储forms。
所以如果你想检查没有特定的请求对象的东西,就像你说的,你只需要访问同一个存储。 在第一个文档页面的底部,它详细描述了存储需要实现的方法,所以如果你熟悉存储API,也许你可以执行一个.getAll()
如果类似的东西存在,并循环通过会话数据和读取你想要的任何值。
概观
Express.js使用cookie在用户的浏览器中存储会话ID(带有encryption签名),然后在随后的请求中使用该cookie的值来检索存储在服务器上的会话信息。 这个服务器端存储可以是一个内存存储(默认)或任何实现所需方法的其他存储(如connect-redis )。
细节
Express.js / Connect使用utils.uid(24)
创build24个字符的Base64string,并将其存储在req.sessionID
。 这个string然后被用作cookie中的值。
客户端
签名的Cookie总是用于会话,所以cookie值将具有以下格式。
[sid].[signature]
其中[sid]是sessionID,[signature]是通过使用初始化会话中间件时提供的密钥签名[sid]生成的。 签署步骤是为了防止篡改。 在计算上不可能修改[sid],然后在不知道使用的密钥的情况下重新创build[签名]。 如果不需要修改[sid],会话cookie仍然容易被窃取和重复使用。
这个cookie的名字是
connect.sid
服务器端
如果一个处理程序在cookieParser
和session
中间件之后发生,它将有权访问variablesreq.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)
)包含在configuration部分中的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
字段是自定义的。 其他一切都是会话pipe理的一部分。
这个例子来自Express 2.5。
我很好奇他们是如何工作的。
试着看这个答案和维基的东西。
它是否在客户端存储一些cookie?
是的,它通常是一个分配有会话ID的cookie,为了防止伪造,应该使用秘密进行签名。
如果是这样,我在哪里可以find该cookie? 如果需要,我该如何解码?
你不应该在客户端弄乱session cookie。 如果你想使用服务器端的会话,你应该检查出相关的express.js并连接文档。