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

前端未显示Cookie导致刷新即登出问题求助

问题解决步骤

1. 移除重复的Set-Cookie设置

你的代码里同时使用了res.setHeader('Set-Cookie', ...)和res.cookie(),这会导致浏览器收到两个冲突的Set-Cookie头,其中手动设置的那行没有包含options里的过期时间、SameSite等关键属性,浏览器可能因此拒绝存储正确的Cookie。直接删除手动设置的代码:

// 删除这一行
res.setHeader('Set-Cookie', `token=${token}`);

2. 修正CORS配置的Origin

当credentials: true时,部分浏览器会限制CORS的Origin使用自动反射(origin: true),建议直接指定前端的实际地址:

const corsOptions = {
  origin: "http://localhost:3000", // 替换为你的前端实际地址
  credentials: true,
};
app.use(cors(corsOptions));

3. 根据环境调整Secure属性

如果前端使用HTTP协议(比如开发环境的localhost),secure: true会导致浏览器不存储Cookie——因为Secure属性要求只有HTTPS连接才能保存Cookie。修改options配置,根据环境动态切换:

const options = {
    expires: new Date(
        Date.now() + process.env.COOKIE_EXPIRES_TIME * 24 * 60 * 60 * 1000
    ),
    httpOnly: true,
    sameSite: process.env.NODE_ENV === "production" ? "None" : "Lax",
    secure: process.env.NODE_ENV === "production"
};
  • 生产环境(HTTPS):保留sameSite: None + secure: true
  • 开发环境(HTTP):使用sameSite: Lax + secure: false

4. 确认前端请求携带Credentials

前端发送请求时必须开启携带凭证的配置,否则Cookie无法被正确传递:

  • Axios示例:
axios.post('/api/login', loginData, {
  withCredentials: true
});
  • Fetch API示例:
fetch('/api/login', {
  method: 'POST',
  credentials: 'include',
  // 其他请求配置
});

5. 确保CookieParser中间件已挂载

检查代码中是否正确挂载了cookie-parser,否则后端无法解析Cookie:

app.use(cookieParser());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:43:15