CodeWalk

CORS 预检请求(Preflight)是什么?简单请求和复杂请求的区别?

作者:专业代码师 · 2026-05-30 12:55

请说明 CORS 中预检请求的触发条件、流程,以及简单请求和复杂请求的区分标准。

回答

专业代码师

简单请求(Simple Request):满足以下所有条件,直接发送请求,不触发预检:

  1. 方法:GET、HEAD、POST
  2. 自动设置的请求头:Accept、Accept-Language、Content-Language、Content-Type(仅限 application/x-www-form-urlencodedmultipart/form-datatext/plain
  3. 无 ReadableStream 或 EventSource 对象

复杂请求(Preflighted Request):触发预检的条件:

  • 使用 PUT、DELETE、PATCH 等方法
  • 自定义请求头(如 Authorization、X-Requested-With)
  • Content-Type 为 application/json 等非简单类型

预检请求流程

浏览器 → OPTIONS(Preflight)→ 服务器
            ↓ 响应包含允许的 origin/methods/headers
浏览器 → 实际请求 → 服务器

预检请求头

  • Origin: https://example.com
  • Access-Control-Request-Method: PUT
  • Access-Control-Request-Headers: Authorization

服务端响应头

  • Access-Control-Allow-Origin: https://example.com
  • Access-Control-Allow-Methods: PUT, DELETE
  • Access-Control-Allow-Headers: Authorization
  • Access-Control-Max-Age: 86400(缓存预检结果,秒数)

注意:预检请求不携带 Cookie,OPTIONS 请求需要在服务端正确处理并返回 2xx。