以下从本质区别、触发条件、交互流程、实际示例四个维度,深度拆解“简单请求”和“复杂请求”的跨域表现,帮你彻底理清浏览器的跨域拦截逻辑:
一、核心本质:浏览器如何区分“简单”与“复杂”?
浏览器判定规则的核心是 “是否超出基础请求范围”:
- 简单请求:符合所有浏览器预设的“安全基线”,无需额外校验即可发送。
- 复杂请求:因方法、头信息、内容类型等超出安全基线,需先“问 permission”(预检请求),再决定是否发主请求。
二、详细判定条件(RFC 标准)
1. 简单请求需同时满足 3 个条件
(1)请求方法:只能是 GET、POST、HEAD 三者之一。
(2)自定义请求头:不能有任何自定义头(如 token: xxx、user-agent: custom 都不行),只能用浏览器默认的头(如 Content-Type、Accept、Cookie 等)。
(3)Content-Type 限制:仅允许以下三种之一:
application/x-www-form-urlencoded(普通表单提交)multipart/form-data(文件上传表单)text/plain(纯文本)
2. 复杂请求的触发条件
只要不满足“简单请求”的任意一条,就会触发复杂请求:
- 用了
PUT、DELETE、PATCH等“非简单方法” - 加了自定义请求头(如
Authorization: Bearer xxx) Content-Type是application/json(最常见的场景!)- 发送
ArrayBuffer、Blob等特殊数据类型
三、交互流程对比(附时序图)
1. 简单请求的跨域流程
特点:直接发请求 → 服务器给响应 → 浏览器“事后拦截”

最低0.47元/天 解锁文章
1194

被折叠的 条评论
为什么被折叠?



