部署到AWS EC2的MERN栈应用登录状态无法保持,用户信息瞬间变为undefined求助
修复方案
- 调整session cookie配置
你当前的配置只设置了sameSite: false,Chrome 80+版本要求sameSite: None的第三方cookie必须同时开启secure属性,否则会被浏览器默认拦截。根据你的部署协议调整配置:
如果你使用HTTPS部署服务端:
如果你临时用HTTP测试:cookie:{ sameSite: "none", secure: true, maxAge: 24 * 60 * 60 * 1000 // 配置cookie有效期,默认会话级关闭浏览器就失效 }cookie:{ sameSite: "lax", secure: false, maxAge: 24 * 60 * 60 * 1000 } - 替换session存储方案
express-session默认使用内存存储session,仅适合开发环境使用,生产环境会存在内存泄漏、进程重启session丢失的问题,建议替换为MongoDB存储:- 安装依赖:
npm install connect-mongo - 修改session配置:
const MongoStore = require('connect-mongo'); app.use( session({ secret:"secretcode", resave:false, // 没有修改时不需要重存,减少性能损耗 saveUninitialized:false, // 未初始化的session不需要存储,减少无效存储 store: MongoStore.create({ mongoUrl: "你的MongoDB连接地址" }), cookie:{ // 对应上面调整后的cookie配置 } }) ); - 安装依赖:
- 检查前端请求配置
所有发往后端的请求必须开启携带凭证的配置,否则浏览器不会自动带上session cookie:- axios请求:全局配置
axios.defaults.withCredentials = true,或者单个请求添加参数withCredentials: true - fetch请求:添加参数
credentials: 'include'
- axios请求:全局配置
- 验证排查
打开浏览器开发者工具的Application面板,查看Cookies列表中服务端域名下是否存在connect.sid的cookie:- 没有该cookie:说明cookie被浏览器拦截,回到第一步调整cookie配置
- 有该cookie但请求未携带:说明前端未正确开启携带凭证的配置
内容的提问来源于stack exchange,提问作者shane-oo
相关产品推荐
相关产品推荐

