You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js + Express应用中设置会话空闲超时与最大会话超时?

关于cookie.expires与cookie.maxAge的误解

首先明确:这两个配置项不是分别对应空闲超时和最大会话超时,二者本质都是控制会话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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:09:01