当前位置: 首页 > news >正文

什么情况下,浏览器会发送预检请求?

浏览器在发送 跨域请求(CORS 请求) 时,某些特定条件下会先发送一个 预检请求(Preflight Request),这是一个 OPTIONS 方法的 HTTP 请求,用于询问服务器是否允许即将发送的实际请求。


✅ 浏览器不会发送预检请求的情况(“简单请求”)

只有满足以下所有条件的请求才是 简单请求(simple request)不会触发预检

1. 请求方法 是以下之一:

  • GET
  • POST
  • HEAD

2. 请求头(Headers) 只包含以下“安全”字段(大小写不敏感):

  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type(但值有限制)
  • DPR
  • Downlink
  • Save-Data
  • Viewport-Width
  • Width

其中 Content-Type 的值只能是以下三种之一

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

3. 没有使用自定义请求头(如 X-Requested-With, Authorization, My-Custom-Header 等)

4. 请求中没有使用 ReadableStreamFormData 以外的复杂 body 类型(如 ArrayBufferBlob 等可能触发预检)


❌ 触发预检请求(Preflight)的常见情况

只要不满足上述“简单请求”条件,浏览器就会自动发送 OPTIONS 预检请求。典型场景包括:

1. 使用了非简单方法

fetch('/api', { method: 'PUT' })      // PUT、DELETE、PATCH 等都会触发预检
fetch('/api', { method: 'DELETE' })

2. 设置了自定义请求头

fetch('/api', {headers: {'X-Requested-With': 'XMLHttpRequest',   // 自定义头 → 预检'Authorization': 'Bearer xxx',          // 非简单头 → 预检}
})

3. Content-Type 不是简单类型

fetch('/api', {method: 'POST',headers: { 'Content-Type': 'application/json' }, // JSON → 预检!body: JSON.stringify({ name: 'Alice' })
})

⚠️ 虽然 application/json 很常见,但它不是简单请求的 Content-Type,所以会触发预检。

4. 使用了 Fetch 的某些高级特性

  • 读取响应中的非简单头(通过 Access-Control-Expose-Headers 暴露的除外)
  • 使用 credentials: 'include' 并且有自定义头或非简单方法

🔍 预检请求长什么样?

OPTIONS /api/data HTTP/1.1
Host: api.example.com
Origin: https://your-site.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: authorization,content-type

服务器必须正确响应(返回 200 + CORS 相关头),浏览器才会发送真正的请求:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://your-site.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: authorization,content-type
Access-Control-Max-Age: 86400  // 可缓存预检结果(秒)

🛠 如何避免不必要的预检?

  • 尽量使用 GET/POST + 简单 Content-Type
  • 避免添加非必要的自定义请求头
  • 如果必须用 application/json,那就接受预检(这是正常行为)

✅ 总结

条件 是否触发预检
GET + 简单头 ❌ 否
POST + Content-Type: application/json ✅ 是
PUT / DELETE ✅ 是
添加 Authorization ✅ 是
添加 X-Custom-Header ✅ 是

💡 记住:只要不是“简单请求”,就会触发预检。

这是浏览器出于安全考虑实施的 CORS 安全机制,无法绕过,但可以优化(如设置 Access-Control-Max-Age 缓存预检结果)。

http://www.jsqmd.com/news/344624/

相关文章:

  • 2026年云南诚信的移动式污泥压滤车处理车租赁出租,泥浆运输车租赁出租,移动式污泥脱水车处理车租赁出租公司行业精选名录 - 品牌鉴赏师
  • 2026年知名的乌鲁木齐线上审车/乌鲁木齐一站式审车优质服务榜 - 品牌宣传支持者
  • 讲讲山西电力塔生产厂选购要点,哪个品牌口碑和技术都好 - 工业品网
  • 2026年医药车间净化板漆面耐化学品性差修复品牌推荐 - 工业品牌热点
  • 2026年好用的富氢水水质探头源头厂家有哪些 - mypinpai
  • 京东e卡还能这样回收?一招搞定! - 团团收购物卡回收
  • struct resource
  • 值得选的户外运动公司,邦格敦煌徒步线路安排是否合理 - 工业设备
  • 分布式风电场低电压穿越故障建模与仿真(开题报告)
  • 矿区防爆气象站 石化厂防爆气象站
  • 防爆型自动气象站 重大危险源监测
  • 写了三年 JavaScript,我才真正用对 while 和 do-while
  • 2026乐山优质跷脚牛肉门店推荐指南 - 优质品牌商家
  • 30 个新颖微信小程序毕业设计题目
  • 星载AI的生死考场:构建辐射故障注入仿真平台的三重架构
  • 专著第二主编评正高有用吗?
  • 无人机用风速风向仪
  • 分期乐天虹提货券回收变现避坑指南,小白必读 - 团团收购物卡回收
  • 企业级项目高并发场景下通用监控指标设计参考
  • 百考通AI问卷设计:让专业调研,一键触达
  • Kubernetes v1.27.6 三节点(Cilium+API Gateway)完整部署文档
  • 元宇宙经济审计:智能合约在虚拟资产跨链交易的合规测试
  • 百考通AI开题指南:本科论文第一步的高效通关方案
  • 2026年比较好的大连艺术留学申请/大连找艺术留学机构用户好评榜 - 品牌宣传支持者
  • 毕业季高效通关:百考通AI如何重塑你的硕士论文写作体验
  • 【Python+Spark大数据毕设推荐】碳排放数据分析与可视化系统开发 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
  • 含分布式电源多目标粒子群无功优化解决方案
  • 2026年靠谱的兰州水利工程石笼网/甘肃防洪防汛石笼网厂家专业度参考(精选) - 品牌宣传支持者
  • UniCareer这家公司怎么样? - Matthewmx
  • 2026年全国高铁货运快递哪家好?全景呈现及实用参考 综合解析及场景化适配指南 - 深度智识库