浏览器的预检请求OPTIONS到底有什么用?

HI,我是石小石~


如果你经常使用浏览器的控制台查看接口请求,一定对下面的OPTIONS 请求不陌生。

你可能会有疑问,我的代码里明明没有写 OPTIONS 请求,浏览器为什么会有这样一个请求记录。其实,这是浏览器内置的一种安全机制------预检请求(Preflight Request)

什么是预检请求

CORS 预检请求 用于检查服务器是否支持 CORS 协议,并且是否允许使用特定的方法和标头。它通常是一个带有以下标头的 OPTIONS 请求:

正常情况下,作为前端开发者,我们不需要自己去发这样的请求。当浏览器检测到即将发出的跨域请求不够"安全"时,才会先向目标服务器"打个招呼",确认对方是否允许再继续。

这个过程就好比你去坐地铁:

  • 简单请求:带个水杯进地铁,安检员看一眼放行(不触发预检)。
  • 非简单请求:带了大包裹(复杂请求),安检员会让你先过一遍安检机(触发预检)。

安检确认没问题后,才允许你真正进入。

什么时候会触发预检请求

对于"简单请求",浏览器不会触发预检机制,所谓"简单请求",满足以下条件即可:

  • 方法 :仅限 GETHEADPOST
  • 请求头 :仅限 AcceptAccept-LanguageContent-Language,以及 Content-Type(且值只能是 application/x-www-form-urlencodedmultipart/form-datatext/plain

一旦超出上述范围,就会触发预检。比如:

  • 使用了 PUTDELETEPATCH 等方法
  • 请求头里加了 AuthorizationX-Custom-HeaderContent-Type: application/json
  • 请求需要携带 Cookie 或其他认证信息(withCredentials=true

预检请求的实际流程

我们通过一个案例来查看预检请求的工作流程。

假设,我们的网页有一个新增功能,点击后会调用POST 接口。

点击按钮后,客户端会在实际发送 post请求之前,先向服务器发起预检请求,用于询问是否可以向服务器发起 post 请求:

如果服务器允许,那么服务器就会响应这个预检请求。并且其响应标头 Access-Control-Allow-Methods 会将 POST 包含在其中:

预检响应可以通过类似上面的例子中的 Access-Control-Max-Age 标头来缓存,以便在同一个 URL 下创建的请求中使用。

为了缓存预检响应,浏览器使用一个特定的缓存,这个缓存是与浏览器管理的一般 HTTP 缓存分开的。预检响应永远不会被缓存在浏览器的一般 HTTP 缓存中。

如何在控制台过滤预检请求

预检请求是浏览器的一种安全机制,无法取消。如果触发次数过多,可能会在排查问题时带来干扰。

Chrome DevToolsNetwork 面板中,我们可以通过下面两种方式过滤:

  • 输入 -method:OPTIONS 来过滤掉 OPTIONS 请求,只看其他请求;
  • 或直接点击 Fetch/XHR 按钮,快速隐藏无关请求。
相关推荐
华玥作者5 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
Mr Xu_5 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠5 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
lang201509286 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
好家伙VCC6 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
未来之窗软件服务7 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
嘿起屁儿整7 小时前
面试点(网络层面)
前端·网络
VT.馒头7 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
phltxy8 小时前
Vue 核心特性实战指南:指令、样式绑定、计算属性与侦听器
前端·javascript·vue.js
Byron07079 小时前
Vue 中使用 Tiptap 富文本编辑器的完整指南
前端·javascript·vue.js