express-session多用户会话冲突问题求助
多用户会话共用问题排查与修复方案
核心问题定位
你代码里的全局变量中间件犯了关键错误:使用app.locals存储用户信息和flash消息。app.locals是应用级全局变量,所有请求共享同一空间——当第二个用户完成登录后,app.locals.user会被新的req.user覆盖,导致所有后续请求(包括其他用户的)都加载最后登录用户的会话数据。
修复步骤
把全局变量的赋值对象从app.locals改成res.locals,res.locals是请求级变量,每个请求都有独立副本,不会出现跨用户覆盖的问题。修改后的代码如下:
// Global variables app.use((req, res, next) => { res.locals.message = req.flash('message'); res.locals.success = req.flash('success'); res.locals.user = req.user; next(); });
额外优化建议
为提升会话安全性和性能,还可以调整这些session配置:
- 将
resave: true改为resave: false:无需强制保存未修改的会话,减少数据库读写压力 - 将
saveUninitialized: true改为saveUninitialized: false:不保存未初始化的空会话,符合隐私规范 - 将
cookie.httpOnly设为true:禁止前端JS访问会话cookie,防范XSS攻击(除非你有必须前端操作cookie的特殊需求) - 不要硬编码
secret:改用环境变量(比如process.env.SESSION_SECRET),避免敏感信息泄露
内容的提问来源于stack exchange,提问作者Khakovs
相关产品推荐
相关产品推荐

