如何禁止通过 Express-session 存储的会话的 TTL 刷新?
How to disallow TTL refresh for sessions stored through Express-session?
我对会话处理有一些要求,但我无法执行其中的一个。
会话需要:
- 如果用户不活跃,30 分钟后过期
- 无论 activity.
用户首次登录后 8 小时后过期
我能够配置第 1 项但不能配置第 2 项。每次用户浏览应用程序时,cookie 都会更新(时间 +30 分钟)并发送回浏览器,但同时会话存储 TTL也刷新了。最后一部分是我需要停止的。
我相信 TTL 刷新是作为 express-session 的一项功能实现的。 Session.touch() 被中间件调用,但是否有一个设置可以删除此操作?
堆栈:
用于会话存储的 Node、express、express-session、connect-redis。
配置:
app.use(session({
store: new RedisStore({
client: redis_client,
ttl: 28800 // 8 hours
}),
secret: config.redis_session_secret,
resave: false,
saveUninitialized: false,
cookie: {
path: '/',
httpOnly: true,
secure: false,
maxAge: 30 * 60 * 1000 //mins * seconds * milliseconds. session cookie will expire every 30 mins
},
rolling: true
}));
我认为选项 2 不是快速会话支持的功能。因此,您可以只向每个会话添加一个 属性 来指示它的开始时间,然后每隔 10 分钟左右(可能在间隔计时器上),查询 属性 所在的所有会话超过 8 小时并将其从数据库中删除。
您可以实施中间件来检查每个请求的会话过期时间,并在发现会话超过 8 小时时删除会话。
您应该知道,实现此行为可能会导致用户在使用您的应用程序的过程中丢失他们的会话(这就是通常不以这种方式实现的原因)。
我对会话处理有一些要求,但我无法执行其中的一个。
会话需要:
- 如果用户不活跃,30 分钟后过期
- 无论 activity. 用户首次登录后 8 小时后过期
我能够配置第 1 项但不能配置第 2 项。每次用户浏览应用程序时,cookie 都会更新(时间 +30 分钟)并发送回浏览器,但同时会话存储 TTL也刷新了。最后一部分是我需要停止的。
我相信 TTL 刷新是作为 express-session 的一项功能实现的。 Session.touch() 被中间件调用,但是否有一个设置可以删除此操作?
堆栈: 用于会话存储的 Node、express、express-session、connect-redis。
配置:
app.use(session({
store: new RedisStore({
client: redis_client,
ttl: 28800 // 8 hours
}),
secret: config.redis_session_secret,
resave: false,
saveUninitialized: false,
cookie: {
path: '/',
httpOnly: true,
secure: false,
maxAge: 30 * 60 * 1000 //mins * seconds * milliseconds. session cookie will expire every 30 mins
},
rolling: true
}));
我认为选项 2 不是快速会话支持的功能。因此,您可以只向每个会话添加一个 属性 来指示它的开始时间,然后每隔 10 分钟左右(可能在间隔计时器上),查询 属性 所在的所有会话超过 8 小时并将其从数据库中删除。
您可以实施中间件来检查每个请求的会话过期时间,并在发现会话超过 8 小时时删除会话。
您应该知道,实现此行为可能会导致用户在使用您的应用程序的过程中丢失他们的会话(这就是通常不以这种方式实现的原因)。