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

Express每次API调用生成新会话,Fetch/Axios请求无法维持会话的问题

跨域请求下Express会话Cookie无法携带的问题修复

你的问题核心是:浏览器直接访问后端时会话稳定,但使用Fetch/Axios发起跨域请求时,Cookie未被携带,导致每次请求生成新的Session ID。以下是具体的排查和修复步骤:

1. 解决CORS配置冲突

你同时启用了cors官方中间件和自定义CORS响应头中间件,这会导致响应头重复,浏览器会因此拒绝处理Cookie。

修复操作:
删除自定义的CORS中间件代码块,仅保留cors中间件,并将origin设置为前端的具体域名(不能用true或*,因为credentials: true时必须指定明确源):

app.use(cors({
  credentials: true,
  origin: "http://localhost:5173" // 替换为你的前端实际端口/域名
}));

2. 修正Session Cookie的SameSite与Secure配置

跨域场景下,Cookie的SameSite规则会影响浏览器是否携带Cookie:

  • 若前端与后端跨域(含不同端口),生产环境(HTTPS)需设置sameSite: 'none',同时必须开启secure: true;
  • 本地开发(HTTP)时,secure需设为false,sameSite用lax即可。

配置示例:

app.use(sessions({
    secret: "thisismysecrctekeyfhrgfgrfrty84fwir767",
    saveUninitialized: false,
    resave: false,
    proxy: false,
    cookie: {
        path: '/',
        maxAge: null,
        httpOnly: true, // 建议开启,提升安全性,不影响Cookie携带
        secure: process.env.NODE_ENV === 'production',
        sameSite: process.env.NODE_ENV === 'production' ? 'none' : 'lax',
        name: 'app.sess.id',
      },
}));

3. 确认请求端的Credentials配置

  • Fetch请求的credentials: 'include'配置正确;
  • Axios请求的withCredentials: true配置正确,同时确保前端域名与后端cors配置的origin完全一致(包括协议、域名、端口)。

4. 检查中间件顺序

确保Session中间件在CORS、bodyParser、cookieParser之后,路由之前,正确顺序如下:

// 中间件加载顺序
app.use(cors(...));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(sessions(...));

// 路由定义
app.get('/', (req, res) => {
    // ... 路由逻辑
});

验证方法

修改配置后重启后端,通过浏览器开发者工具验证:

  • 在Application > Cookies面板查看是否存在app.sess.id;
  • 查看请求头的Cookie字段,确认每次请求都携带该Cookie;
  • 后端控制台打印的req.session.id应保持一致。

内容的提问来源于stack exchange,提问作者mbouclas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:13:10