Node.js - 会话不会通过 res.redirect() 持续存在
Posted
技术标签:
【中文标题】Node.js - 会话不会通过 res.redirect() 持续存在【英文标题】:Node.js - Session doesn't persist through res.redirect() 【发布时间】:2012-01-10 19:53:33 【问题描述】:我(几乎)成功地将 Node.js 与 Express 和 Redis 一起使用来处理会话。
我遇到的问题是当我使用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
很明显,“用户名”对象已经消失了。会话没有保留它,只是重建了一个新的。
我该如何解决这个问题?如果您需要任何信息,请不要犹豫。
这是我设置会话管理的代码:
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(忽略渲染视图的属性)
【问题讨论】:
能否将代码粘贴到包含 Redis 会话存储的位置?那里有一个超时选项,可能你不小心把它设置得太低了。 已添加 :) 设置为 60 秒,我显然不使用 60 秒来编写凭据... 我认为这是一个小项目,我认为最好将其发布在某个地方(要点,粘贴)并提供链接。我敢打赌,错误出在您未粘贴的代码中。 (只是猜测) 最后添加了要点链接 @Florian 我投票给你。这是我能为你做的最多的事情:-) 【参考方案1】:好的,我找到了解决方案。问题是maxAge
中的时间被添加到当前日期。因此,在浏览器端,cookie 被设置为在显示的 GMT 时间过期。
问题如下:我使用虚拟机来测试 node.js,而且,你知道...有时,你会挂起你的机器。
嗯,发生的事情是机器的时间晚了两天。因此,每当在服务器端设置 cookie 时,客户端都会认为 cookie 已经过期,因为我的主机并没有迟到两天。
另一个愚蠢的结果。
【讨论】:
嘿,我也有类似的问题。你能帮我吗? ***.com/questions/64512910/…【参考方案2】:你试过不同的浏览器吗?您是否在页面重定向之间保持相同的会话 ID?
您可以在重定向之前添加req.session.cookie.expires = false;
...
【讨论】:
【参考方案3】:您的代码看起来很可靠,但是您使用 client.end() 有什么原因吗?强行关闭redis连接,不干净。我认为你根本不需要它:
https://github.com/mranney/node_redis/issues/74
我不确定 connect-redis 的底层架构,但我想知道调用 client.end 是否会重置会话。如果你把它们拿出来会怎样?
【讨论】:
谢谢,我不知道。我以为它会更干净。虽然它并没有解决问题,但我正在为你 +1 :)【参考方案4】:我遇到了类似的问题,因为我在会话中设置了一些在设置的 app.get()
之外没有持续存在的东西。
我的问题原来是我没有在我的app.get()
末尾做一个res.redirect()
。看起来我在请求对象上设置了一些东西,然后允许它收集垃圾。
我添加了一个res.redirect( '/nextmethod' )
,数据仍然很好。
【讨论】:
【参考方案5】:您当然需要以某种方式保存该会话,这可能有效。
req.session.regenerate(function()
req.session.username = username.toString();
res.redirect('/home');
);
【讨论】:
不幸的是,这并没有改变任何东西。顺便问一下,这个 regenerate 函数有什么意义? 如果您要修改存储在持久性数据库中的数据,您需要先保存它,然后才能在系统的其他部分使用它,这是合乎逻辑的。我很惊讶 req.session.username 变量持续存在而不保存任何东西......也许它是作为一个功能自动完成的以上是关于Node.js - 会话不会通过 res.redirect() 持续存在的主要内容,如果未能解决你的问题,请参考以下文章
没有 req.session.save() 会话不会保存在 Node.js 中
Keycloak node.js 适配器不会在注销时使 connect.sid 会话 cookie 无效