React+Node.js开发登录系统时express-session刷新丢失如何解决?
express-session刷新丢失会话修复方案
- 修正session cookie有效期配置
你当前的expires: 60 * 30写法完全错误:expires参数需要传入Date类型的到期时间点,直接传入数字会被解析为1970年时间戳+1800毫秒,相当于cookie创建后立即过期,刷新页面自然无法携带有效会话凭证。建议替换为maxAge参数,单位为毫秒,30分钟有效期配置如下:
cookie: { // 替换expires为maxAge,单位毫秒 maxAge: 1000 * 60 * 30, // 本地跨端口调试先改为lax,避免strict策略拦截跨端口请求的cookie携带,生产可改回strict sameSite: 'lax', // 本地http环境必须设为false,生产https环境可开启为true提升安全性 secure: false }
- 补全session配置的语法闭合
你提供的server.js代码中,app.use(session({...}配置末尾缺少闭合的括号和分号,会导致语法错误,session配置完全不生效,修正后完整配置如下:
app.use(session({ name: 'session', secret: 'crud', resave: false, saveUninitialized: false, cookie: { maxAge: 1000 * 60 * 30, sameSite: 'lax', secure: false } }));
- 替换为持久化session存储
express-session默认使用内存存储会话,仅适合临时调试:服务重启、代码热更新都会清空内存内的所有会话,且存在内存泄漏风险,生产环境必须搭配持久化存储。你使用MySQL作为数据库,可搭配express-mysql-session存储会话:
- 安装依赖:
npm install express-mysql-session - 调整server.js配置:
const MySQLStore = require('express-mysql-session')(session); // 配置MySQL会话存储 const sessionStore = new MySQLStore({ host: '你的MySQL服务地址', port: 3306, user: 'MySQL用户名', password: 'MySQL密码', database: '你的业务数据库名' }); // session配置中新增store参数 app.use(session({ name: 'session', secret: 'crud', resave: false, saveUninitialized: false, store: sessionStore, cookie: { maxAge: 1000 * 60 * 30, sameSite: 'lax', secure: false } }));
- 调整Axios全局配置
你当前仅在登录页设置Axios.defaults.withCredentials = true,建议将这行配置移到项目全局的Axios初始化文件中,确保所有请求自动携带凭证,避免单页配置遗漏。
内容的提问来源于stack exchange,提问作者WHXY
相关产品推荐
相关产品推荐

