Express SessionID与Cookie中的SessionID不同

我有一个相应的问题,使用给出的例子。 在这个例子中,会话在WebSocket中被使用,首先重载:

socket.on('set value', function (val) { sess.reload(function () { sess.value = val; sess.touch().save(); }); }); 

试图在我自己的应用程序中使用它,我得到以下exception:

  sess.reload(function () { ^ TypeError: Object #<Object> has no method 'reload' 

我认为问题是,没有人将variablessess定义为会话:

 io.listen(app).set('authorization', function (data, accept) { if (!data.headers.cookie) return accept('No cookie transmitted.', false); data.cookie = parseCookie(data.headers.cookie); data.sessionID = data.cookie['express.sid']; store.load(data.sessionID, function (err, session) { if (err || !session) return accept('Error', false); data.session = session; return accept(null, true); }); }) 

也许有些人有这个短暂的修复?

问题解决了:我尝试使用这个例子: https : //github.com/DanielBaulig/sioe-demo/blob/master/app.js Express 3.0和Redis。

因此,我创build了一个Redis存储(connect-redis)而不是MemoryStore:

 app.use(express.session({cookie: {expires: new Date(Date.now() + 30*60*60*24*1000)}, secret: SESSION_SECRET, key: SESSION_KEY, store: new RedisStore({host:'localhost', port:'6379', client: dbRedis})})); 

由于我使用的连接移动parseCookie方法

 parseCookie = require('cookie').parse 

代替

 connect.utils.parseCookie 

要访问Cookie中的会话,我使用以下方法修改了示例:

 sio.set('authorization', function (data, accept) { if (!data.headers.cookie) return accept('No cookie transmitted.', false); data.cookie = parseCookie(data.headers.cookie); log.info('Cookie: $s', JSON.stringify(data.cookie)); data.sessionID = data.cookie['letter.sid']; log.info('SessionId: %s', data.sessionID); dbRedis.get(data.sessionID, function (err, session) { if (err || !session) return accept('Error ' + session, false); data.session = session; return accept(null, true); }); }) 

现在我的问题是,我不能从Redis加载会话,因为会话ID不同打印页面上的会话ID(req.sessionID)我得到:n + 57bnkLr + iXkMLbStWdFzK5但是在Redis中,以下ID是存储的:

 [2012-12-03T22:14:56.632Z] INFO: Postbox/78964 on capns-mba.local: Cookie: $s {"SQLiteManager_currentLangue":"4","connect.sid":"s:xvYdDm5C0MEIg53EG8JgqBnM.Tx8+PMKa570zk6qt9vmCjRz2p/LP/COyyqGSm+VKxww","letter.sid":"s:n+57bnkLr+iXkMLbStWdFzK5.XPHh1xXrK9D4cPfJ7HcHO11PKk8FXLg6fIRGaWb/+jI"} [2012-12-03T22:14:56.632Z] INFO: Postbox/78964 on capns-mba.local: SessionId: s:n+57bnkLr+iXkMLbStWdFzK5.XPHh1xXrK9D4cPfJ7HcHO11PKk8FXLg6fIRGaWb/+jI 

显然,req.sessionID是保存在cookie / redis中的SessionID的一部分 – 但是为什么? 而哪个是正确的sessionID?

从会话中间件 (267行)看这段代码:

 var val = 's:' + signature.sign(req.sessionID, secret); 

其中signature.sign函数是一个串联(伪代码):

 req.sessionID + "." + hash(secret) 

hash是一个自定义函数( 更多细节见这里 )。

这意味着它只是一个cookie的签名约定(使其更安全)。 你可以通过调用你的sid来检索你的sid

 var signature = require( "cookie-signature" ), prefix = "s:"; var real_sid = sid.replace( prefix, "" ); real_sid = signature.unsign( real_sid, SESSION_SECRET );