CORS请求中 credentials 设置为 true 为啥还是报错?
我在前端用 fetch 调用自己后端的登录接口,设置了 credentials: ‘include’,但浏览器一直报 CORS 错误,说不能携带凭证。后端明明加了 Access-Control-Allow-Credentials: true 啊,到底哪里不对?
我试过把 Access-Control-Allow-Origin 设成具体域名而不是 *,也确认 cookie 能正常设置,但一加上 credentials 就失败。
fetch('https://api.example.com/login', {
method: 'POST',
credentials: 'include',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ username: 'test', password: '123' })
})
简单说下原理:浏览器在处理带凭证的跨域请求时,对 CORS 的校验特别严格。哪怕后端返回了正确的 Access-Control-Allow-Credentials: true,如果 Origin 不匹配,照样报错。
建议你在后端这样处理:
另外记得检查 preflight 请求(OPTIONS 方法)是否正确响应这些头部,不然也会出问题。这种预检请求的结果最好缓存起来,减少服务器压力。
最后提醒一句,别忘了在生产环境设置合理的 CORS 缓存时间,不然每次都要走一遍 OPTIONS 请求,性能损失不小。