CORS理解v2
2025-4-24
| 2025-4-25
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password

跨域(CORS)机制总结


1. 浏览器是否会拦截跨域请求?

  • HTML 标签类资源(如 <img>, <script>, <audio>, <link>):
    • 浏览器默认允许加载跨域资源
    • 但 JS 不能操作/读取其内容,除非服务器设置了 Access-Control-Allow-Origin
  • JavaScript 主动发起的请求(如 fetch, XMLHttpRequest):
    • 浏览器会启用 CORS 校验
    • 请求和响应都需符合规范,才能让 JS 正常读取

2. 请求阶段(浏览器会做什么判断?)

浏览器判断请求是否是“简单请求(simple request)”:

简单请求的三个条件:

  1. 请求方法为 GET / HEAD / POST
  1. 请求头只能包含 safelisted headers(如 Accept, Content-Type, 不含自定义头)
  1. Content-Type 仅限于:
      • text/plain
      • application/x-www-form-urlencoded
      • multipart/form-data
满足上述条件 → 直接发请求,不满足 → 触发预检(preflight)

3. 预检请求(OPTIONS)

浏览器先发出一条 OPTIONS 请求,询问服务器是否允许跨域请求。

请求头包含:

服务端响应必须包含:

预检通过 → 浏览器才会发送实际请求

4. 响应阶段(浏览器怎么判断是否允许访问响应内容?)

无论是简单请求还是复杂请求,响应都必须包含:
否则 JS 无法读取响应体、状态码、header

5. 其他注意事项

Access-Control-Allow-Credentials: true 限制:

  • 若请求设置了 credentials: 'include',服务器必须加上该字段
  • 此时 Access-Control-Allow-Origin 不能为 `*` ,只能是具体域名

Access-Control-Expose-Headers

  • 默认 JS 只能访问 6 个响应头
  • 若要暴露自定义 header,需显式声明
  • 网络
  • 路由跳转问题节流
    Loading...