如何在Node.js + Express应用中设置会话空闲超时与最大会话超时?
首先明确:这两个配置项不是分别对应空闲超时和最大会话超时,二者本质都是控制会话Cookie的有效期,仅设置方式有区别:
cookie.maxAge:相对时间配置,单位为毫秒,代表从当前请求时间算起,Cookie将在多少毫秒后过期cookie.expires:绝对时间配置,为Date类型,直接指定Cookie过期的具体时间点
若同时配置两个参数,express-session会优先使用
expires的值;二者都不配置时,Cookie会成为会话级Cookie,用户关闭浏览器后立即失效。
两种超时的实现方案
以下方案基于官方express-session中间件实现:
1. 空闲超时(用户无操作指定时长后会话失效)
开启rolling配置即可实现,该参数的作用是每次用户发起有效请求时,自动刷新Cookie的过期时间:
const session = require('express-session'); app.use(session({ secret: '自定义加密密钥', resave: false, saveUninitialized: false, rolling: true, // 开启后每次请求刷新Cookie有效期 cookie: { maxAge: 30 * 60 * 1000, // 示例为30分钟无操作即过期,可按需调整 httpOnly: true, secure: process.env.NODE_ENV === 'production' // 生产环境建议开启,仅HTTPS传输Cookie } }))
2. 最大会话超时(无论用户是否有操作,达到最长时长强制会话失效)
express-session没有原生支持该配置,需要自行编写全局中间件实现,逻辑是记录会话首次创建时间,每次请求校验是否超过最大时长:
// 该中间件需要放在session配置之后,路由配置之前 app.use((req, res, next) => { const MAX_SESSION_DURATION = 24 * 60 * 60 * 1000; // 示例为最大会话时长24小时,可按需调整 // 会话首次创建时记录初始时间 if (!req.session.createdAt) { req.session.createdAt = Date.now(); } // 校验是否超过最大会话时长 if (Date.now() - req.session.createdAt > MAX_SESSION_DURATION) { req.session.destroy(err => { if (err) return next(err); res.clearCookie('connect.sid'); // 清除会话Cookie,名称根据你配置的name参数调整 return res.status(401).json({ code: 401, msg: '会话已过期,请重新登录' }); }) return; } next(); })
注意事项
- 若你使用第三方会话存储(如Redis、MongoDB),需要给存储的会话数据设置和Cookie匹配的过期时间,避免残留无效会话占用存储空间
- 生产环境不要使用
express-session默认的内存存储,会存在内存泄漏风险,且多实例部署时会话无法跨实例共享,建议使用connect-redis等适配的存储方案
内容的提问来源于stack exchange,提问作者pg238
相关产品推荐
相关产品推荐

