我(几乎)成功地使用带有Express和Redis的Node.js来处理会话。
我遇到的问题是当我使用res.redirect()
时,会话不会被保留。
以下是我如何看待它:
req.session.username = username.toString();
console.log(req.session);
res.redirect('/home');
console.log()打印:
{ lastAccess: 1322579131762,
cookie:
{ path: '/',
httpOnly: true,
_expires: Tue, 29 Nov 2011 15:06:31 GMT,
originalMaxAge: 60000 },
username: 'admin' }
现在,这是以下代码:
app.get('/home', [app.requireLogin], function(req, res, next) {
// Not showing the rest as it's not even getting there
// Instead, here is what's interesting
app.requireLogin = function(req, res, next) {
console.log(req.session);
这个console.log()打印出来:
{ lastAccess: 1322579131775,
cookie:
{ path: '/',
httpOnly: true,
_expires: Tue, 29 Nov 2011 15:06:31 GMT,
originalMaxAge: 60000 } }
显然,'username'对象已经消失。会议没有保留它,只是重建了一个新的。
我该如何解决这个问题?如果您需要任何信息,请不要犹豫。
以下是我设置会话管理的代码:
app.configure(function() {
// Defines the view folder and engine used.
this.set('views', path.join(__dirname, 'views'));
this.set('view engine', 'ejs');
// Allow parsing form data
this.use(express.bodyParser());
// Allow parsing cookies from request headers
this.use(express.cookieParser());
// Session management
this.use(express.session({
// Private crypting key
secret: 'keyboard cat',
store: new RedisStore,
cookie: {
maxAge: 60000
}
}));
this.use(app.router);
});
这是整个项目(我的意思是,它的一部分),在要点上:https://gist.github.com/c8ed0f2cc858942c4c3b(忽略渲染视图的属性)
答案 0 :(得分:6)
好吧,我找到了解决方案。问题是maxAge
中的时间已添加到当前日期。因此,在浏览器端,cookie被设置为在显示的GMT时间到期。
问题如下:我使用虚拟机来测试node.js,你知道......有时,你暂停你的机器。
嗯,发生的事情是机器的时间晚了两天。因此,无论何时在服务器端设置cookie,客户端都认为cookie已经过期,因为我的主机迟了两天。
另一个愚蠢的结果。
答案 1 :(得分:2)
你尝试过不同的浏览器吗?您是否在页面重定向之间保持相同的会话ID?
您可以在重定向...
之前添加req.session.cookie.expires = false;
答案 2 :(得分:1)
您的代码看起来非常可靠,但是您有使用client.end()的原因吗?它强行关闭redis连接并且不干净。我认为你根本不需要它:
https://github.com/mranney/node_redis/issues/74
我不确定connect-redis的底层架构,但我想知道调用client.end是否正在重置你的会话。如果你拿出来会怎么样?
答案 3 :(得分:1)
我遇到了类似的问题,因为我在会话中设置的内容并未在app.get()
设置的位置之外保留。
我的问题原来是我 在res.redirect()
结尾处app.get()
做了 。看起来我在请求对象上设置了一些东西,然后允许它收集垃圾。
我添加了res.redirect( '/nextmethod' )
,数据仍然存在。
答案 4 :(得分:0)
当然,您需要以某种方式保存该会话,这可能会有效。
req.session.regenerate(function(){
req.session.username = username.toString();
res.redirect('/home');
});