ajax跨域问题
- 跨域只存在于浏览器。
是由于浏览器同源安全策略导致的(所以后端用postman访问告诉你没跨域时,别奇怪)
同源策略(Same-Origin Policy, SOP) 是 浏览器 实施的一种安全机制,限制不同源的网页互相访问数据,防止跨站脚本攻击(XSS)和跨站请求伪造(CSRF)。
所谓同源是指协议、主机名、端口三者都必须相同:
http://example.com:80 ✅ 与 http://example.com:80 同源
https://example.com:80 ❌ 不同协议
http://sub.example.com:80 ❌ 不同主机
http://example.com:8080 ❌ 不同端口 - 跨域发送预检请求(OPTIONS)问题
- 只有 复杂请求(Non-Simple Requests)才会触发 预检请求(OPTIONS)。
- 简单请求(Simple Requests) 不会 触发预检请求。
什么是"简单请求"?
- 请求方法(Method) 只能是
GET、POST、HEAD - 请求头(Headers) 只能是:
AcceptAccept-LanguageContent-LanguageContent-Type(但只能是application/x-www-form-urlencoded、multipart/form-data、text/plain之一)
- 请求不能使用
XMLHttpRequest或 Fetch 的credentials
✅ 如果不满足上面的条件,就会触发
OPTIONS预检请求。 - 请求方法(Method) 只能是
- 服务端配置的 Header 头
常见的 CORS 相关 Header:
Header 作用 Access-Control-Allow-Origin允许访问的域,如 *或https://example.comAccess-Control-Allow-Methods允许的 HTTP 方法,如 GET, POST, PUT, DELETEAccess-Control-Allow-Headers允许的请求头,如 Content-Type, AuthorizationAccess-Control-Allow-Credentials是否允许携带 cookies,值为true或falseAccess-Control-Max-Age预检请求的缓存时间,减少 OPTIONS请求注意:
Access-Control-Allow-Origin: *不能和Access-Control-Allow-Credentials: true同时使用,否则浏览器会拒绝请求。
- cookie问题
cookie问题的总结
当前端使用fetch或XMLHttpRequest进行跨域请求时,默认情况下不会携带cookies,除非显式开启。可以在
fetch或XMLHttpRequest请求中,设置credentials: 'include',让浏览器自动带上该域名下的 Cookie:fetch("https://api.example.com/data", { method: "GET", credentials: "include" // 让浏览器携带跨域 Cookie }) const xhr = new XMLHttpRequest(); xhr.open("GET", "https://api.example.com/data", true); xhr.withCredentials = true; // 让浏览器携带跨域 Cookie xhr.send();
注意:只有cookie同源时上述设置才能生效,否则设置了也是白搭
为什么客户端无法读取Set-Cookie?
即使跨域请求成功,客户端的 JavaScript 依然无法直接访问
Set-Cookie,因为:Set-Cookie不会出现在 CORS 允许的 Headers 里(即使Access-Control-Allow-Headers设置了也不行)。Set-Cookie是 HTTP 头,浏览器自动处理,不允许 JavaScript 读取,以防止跨站脚本(XSS)攻击。- Cookie 只能被浏览器自动携带,而无法通过 JavaScript 手动获取。

浙公网安备 33010602011771号