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 

服务器端

如果一个处理程序在cookieParsersession中间件之后发生,它将有权访问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部分中的cookieParsersession之后。

以下是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并连接文档。