ZiMingの宝藏之地
首页项目归档笔记照片墙音乐灵境说说杂谈友链关于
知识库
138 篇文档 / 65 个目录
目录菜单
主页知识库
飞书飞书知识库/前端/面试/其他/Post为什么要发送两次请求?

Post为什么要发送两次请求?

同步时间:2026-05-26T15:20:18

1.跨域预检请求(OPTIONS)面试速记卡片

(直接背,面试张口就来)


一、核心问题:为什么 POST 经常发两次?

  • 这不是两次 POST,而是浏览器的预检请求(OPTIONS)。

  • 当请求是非简单请求时,浏览器会先发送一次 OPTIONS 请求,向服务器询问:“我能不能跨域请求你?”

  • 服务器返回允许后,才会发送真正的 POST 请求;如果服务器拒绝,就会直接报跨域错误。

  • GET 请求大多是 “简单请求”,所以很少触发预检。


二、什么情况下浏览器会自动发 OPTIONS?

只要满足以下任意一条,就会触发预检:

  1. 请求方法不是 GET/POST/HEAD(比如 PUT/DELETE)

  2. 携带了自定义请求头(如 token、Authorization)

  3. Content-Type 不是 text/plain/application/x-www-form-urlencoded/multipart/form-data(比如 application/json)


三、怎么优化让 OPTIONS 少发甚至不发?

  1. 缓存预检结果:后端设置 Access-Control-Max-Age 响应头,让浏览器缓存 OPTIONS 的结果,避免每次都发送。

  2. 尽量用简单请求格式:

  • 避免使用 application/json,改用 application/x-www-form-urlencoded 格式。

  • 减少自定义请求头,非必要不携带额外字段。

  1. 同域部署:从根源上避免跨域请求,也就不会触发预检了。

一句话总结

OPTIONS 预检请求的本质,是浏览器为了跨域安全,在发送非简单请求前的 “确认机制”,优化的核心是缓存预检结果或让请求变成简单请求。

图

图片

图片

图片

图片

图片

图片

Table of Contents