2011-02-08 61 views
9

我已经观察了连续的请求会话ID和观察到的一些事情会话ID,我无法解释:困惑过使用连接

1)当调用req.sessionIDreq.cookies["connect.sid"]的值不同(这出现request.sessionID神奇地从相关响应中恢复SID--这在我看来是不可能的)。

从我对Connect源代码的理解中,req.sessionID就是cookie关键字的代名词,为什么有区别?

2)我第一次向节点服务器发出请求时,浏览器会发出一个SID(我们称之为SID1)。下一次连接时,浏览器将发布SID2。第三次及以后,我再次发布SID2。为什么节点+连接在建立之前发出两个会话ID?

+0

我想我找到了解决方案,下面的解释在答案中。 – Matt

回答

8

因此,这是我的结论:

1)由于请求正在经历中间件/模块,我只能在登录踢之前,假设当前SID贴在请求。这将部分解释为什么req.sessionID可能包含SID2,req.cookies["connect.sid"]包含之前的SID1。

一些注意事项:

  • 这种现象只出现在浏览器首次到一个新的节点服务器实例连接。

  • 浏览器必须已连接到节点服务器的先前实例,该服务器发出具有相同键值的cookie(例如connect.sid)。

2)围绕两个芝麻和连接的源代码后偷看我已经认识到,他们保留所有他们所发出的会话ID的记录 - 以前未知的我。我怀疑这是阻止会议固定的一步。

考虑到这一点,我意识到在初始连接期间,请求中发送的SID1从以前的会话cookie中遗留下来。 Connect会在它的会话存储中查找匹配发送cookie的SID1的会话,但由于它是节点服务器的新实例(这里只是内存会话,没有持久会话ATM)将无法找到它,因此会有新的SID (SID2)将发布 - 这一个坚持。应该早点想到这一点。 :)

TL; DR预期行为。为了安全起见,旧会话中的cookie不会被重用。

3

req.sessionIDreq.cookies["connect.sid"]相同。

但是,如果您使用的是supervisornodemon,则修改文件时将重新启动服务器。当服务器重新启动时,它将删除服务器存储的所有会话,但客户端不清除存储在cookie中的旧sessionID。所以你可以得到不同的会话ID。

请参阅this answer了解更多信息。