跨域请求中Ajax携带Cookie需前后端协同配置:前端设置withCredentials或credentials: 'include',后端返回Access-Control-Allow-Credentials: true且Access-Control-Allow-Origin不能为*,Cookie须设SameSite=None且Secure=true。

在跨域请求中让 Ajax 携带 Cookie,关键在于前后端协同配置 withCredentials 和响应头,缺一不可。
前端:设置 xhr 或 fetch 的 credentials 选项
XMLHttpRequest 需显式开启 withCredentials:
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data');
xhr.withCredentials = true; // 必须设为 true
xhr.onload = () => console.log(xhr.responseText);
xhr.send();
Fetch API 则通过 credentials 选项控制:
-
credentials: 'include'—— 总是携带 Cookie(即使跨域) -
credentials: 'same-origin'—— 同源时携带(默认行为) -
credentials: 'omit'—— 从不携带(默认值,需显式改)
✅ 正确示例:
立即学习“Java免费学习笔记(深入)”;
fetch('https://api.example.com/data', {
method: 'POST',
credentials: 'include', // 关键
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ x: 1 })
});
后端:必须返回 Access-Control-Allow-Credentials: true
浏览器收到跨域响应时,若发现 Access-Control-Allow-Credentials 不是 true,会直接拒绝响应(即使状态码是 200),JS 中也拿不到数据。
⚠️ 注意:Access-Control-Allow-Origin 不能为通配符 *,必须指定明确的源(如 https://your-app.com)。
常见后端设置示例:
- Express(Node.js):
res.header('Access-Control-Allow-Credentials', 'true'); res.header('Access-Control-Allow-Origin', 'https://your-app.com'); - Nginx:
add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Origin' 'https://your-app.com';
Cookie 本身也要满足跨域发送条件
即使前后端都配对了,浏览器仍可能不发 Cookie。需确保 Cookie 具备以下任一条件:
- 未设置
SameSite属性(旧浏览器兼容) -
SameSite=None且Secure=true(现代浏览器强制要求 HTTPS 下才允许跨站发送)
❌ 错误写法:Set-Cookie: sessionid=abc; SameSite=None(缺少 Secure)
✅ 正确写法:Set-Cookie: sessionid=abc; SameSite=None; Secure; HttpOnly
其他注意事项
预检请求(OPTIONS)也必须支持 credentials:
- 后端对 OPTIONS 请求同样要返回
Access-Control-Allow-Credentials: true和合法的Origin - 若使用自定义 header(如
Authorization),需额外声明Access-Control-Allow-Headers
登录态验证失败时,服务端应返回明确状态(如 401),前端可通过 response.status 或响应体判断,而不是因 CORS 被静默拦截而无感知。


















