CORS 预检请求(Preflight)是什么?简单请求和复杂请求的区别?
请说明 CORS 中预检请求的触发条件、流程,以及简单请求和复杂请求的区分标准。
回答
专业代码师
简单请求(Simple Request):满足以下所有条件,直接发送请求,不触发预检:
- 方法:GET、HEAD、POST
- 自动设置的请求头:Accept、Accept-Language、Content-Language、Content-Type(仅限
application/x-www-form-urlencoded、multipart/form-data、text/plain) - 无 ReadableStream 或 EventSource 对象
复杂请求(Preflighted Request):触发预检的条件:
- 使用 PUT、DELETE、PATCH 等方法
- 自定义请求头(如 Authorization、X-Requested-With)
- Content-Type 为
application/json等非简单类型
预检请求流程:
浏览器 → OPTIONS(Preflight)→ 服务器
↓ 响应包含允许的 origin/methods/headers
浏览器 → 实际请求 → 服务器
预检请求头:
Origin: https://example.comAccess-Control-Request-Method: PUTAccess-Control-Request-Headers: Authorization
服务端响应头:
Access-Control-Allow-Origin: https://example.comAccess-Control-Allow-Methods: PUT, DELETEAccess-Control-Allow-Headers: AuthorizationAccess-Control-Max-Age: 86400(缓存预检结果,秒数)
注意:预检请求不携带 Cookie,OPTIONS 请求需要在服务端正确处理并返回 2xx。