Node.js:用户活跃时更新Redis中Session的TTL以避免自动登出
实现Redis会话活跃时自动延长TTL的方案
要解决用户活跃时避免15分钟自动登出的问题,核心是在用户每次发起请求时,同步刷新Redis中会话的TTL和客户端cookie的过期时间,以下是具体实现步骤:
1. 修正基础配置参数
首先检查并修正express-session的配置,确保会话有效期参数一致:
- 将
cookie.maxAge从1500(1.5秒)改为900000(15分钟,与Redis的ttl:900对应,单位毫秒) - 保留
resave: true,该配置会在每次请求时触发会话重新保存,为后续TTL更新提供基础
2. 添加活跃检测中间件
通过自定义中间件,在用户每次发起请求时主动刷新会话TTL:
方法一:利用express-session内置方法(推荐)
使用req.session.touch()方法更新会话的lastModified时间,connect-redis会自动识别该更新并重置Redis中会话的TTL:
app.use((req, res, next) => { if (req.session) { // 更新会话最后活跃时间,触发Redis TTL重置 req.session.touch(); // 同步更新客户端cookie的过期时间 const cookieOpts = req.session.cookie; res.cookie('connect.sid', req.sessionID, { secure: cookieOpts.secure, maxAge: cookieOpts.maxAge, httpOnly: true // 增强cookie安全性,防止前端篡改 }); } next(); });
方法二:直接操作Redis客户端
如果需要更直接的控制,可以手动定位会话对应的Redis键,调用expire命令重置TTL:
app.use((req, res, next) => { if (req.sessionID) { // connect-redis默认会话键前缀为"sess:",拼接完整key const sessionKey = `sess:${req.sessionID}`; // 重置TTL为900秒(15分钟) client.expire(sessionKey, 900, (err) => { if (err) console.error('会话TTL更新失败:', err); }); // 同步更新客户端cookie res.cookie('connect.sid', req.sessionID, { secure: true, maxAge: 900000, httpOnly: true }); } next(); });
完整修改后的代码示例
const session = require('express-session'); const redisStore = require('connect-redis')(session); const redis = require("redis"); var client = redis.createClient(); var app = express(); app.use(session({ secret: 'MY_SECRET', store: new redisStore({ host: '127.0.0.1', port: 6379, client: client, ttl: 900 // 15分钟,单位秒 }), saveUninitialized: true, resave: true, cookie: { secure: process.env.NODE_ENV === 'production', // 生产环境启用HTTPS安全cookie maxAge: 900000, // 15分钟,单位毫秒 httpOnly: true } })); // 活跃时刷新会话TTL的中间件 app.use((req, res, next) => { if (req.session) { req.session.touch(); const cookieOpts = req.session.cookie; res.cookie('connect.sid', req.sessionID, { secure: cookieOpts.secure, maxAge: cookieOpts.maxAge, httpOnly: cookieOpts.httpOnly }); } next(); });
关键说明
req.session.touch()仅更新会话的最后活跃时间,不会修改会话的其他数据,性能开销极低- 客户端cookie的过期时间必须与Redis的TTL保持同步,避免出现客户端cookie已过期但服务端会话仍存在的情况
secure: true仅在HTTPS环境下生效,开发环境可设为false或通过环境变量动态控制
内容的提问来源于stack exchange,提问作者Alan Tang
相关产品推荐
相关产品推荐

