express 的session不同步(被重写)

发布于 2022-09-05 10:17:40 字数 660 浏览 22 评论 0

问题是这样的,在登录时要进行验证码认证,进入登录页后马上请求验证码,同时server端要将生成的验证码存放在对应的session里面。但是发现验证码并没有被正确的写到session里面。
代码类似是这样

getCaptcha(req, res) {
    console.log(req.session.captcha, 'old captcha')
    const captcha = Math.random().toString(10).substr(2, 4)
    req.session.captcha     = captcha
    console.log(req.session.captcha, 'new captcha')
    const captchaImage = image(captcha) // 伪代码:生成验证码的base64的图片
    res.set('Content-Type', 'image/png')
    res.end(img)
}

多次刷新后表现结果是:
2367 old captcha
4567 new captcha
2367 old captcha
7809 new captcha
2367 old captcha
5690 new captcha
也就是session没有被更新,或者说被某些方法重新给写回去了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

深爱成瘾 2022-09-12 10:17:40

NodeJS 建议用来做无状态服务器!。假设你如此开发,部署必然是有负载均衡或者pm2多核。用户A在1核上登录,第二次请求极可能会发送到2核状态立马就丢失了。使用 session 建议使用其他方案替代。

飘落散花 2022-09-12 10:17:40

看看你express session怎么配的,贴关键代码

醉南桥 2022-09-12 10:17:40

查找原因,原来,并发操作时,多个请求取到的是相同的session,在getCaptcha方法更改了session后,另外两个请求在 res.end() 的时候这个阶段 session 的数据会被自动 save 一次(req.session.save() 可以主动保存)。
也就是说在获取验证码的协议(该协议在 session 中特别保存了一次验证码的数据),之后其他请求其他资源协议中附带的 session在 res.end() 的时候重复保存然后把开始的验证码数据给覆盖掉了。
看起来就好像是一个不同步的问题一样,其实就是并发的时候数据重复写入了。
详细解释可以参考: https://cnodejs.org/topic/536...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文