什么时候会发送options请求(预检请求)

OPTIONS请求即预检请求,可用于检测服务器允许的http方法。当发起跨域请求时,由于安全原因,触发一定条件时浏览器会在正式请求之前自动先发起OPTIONS请求,即CORS预检请求,服务器若接受该跨域请求,浏览器才继续发起正式请求。

总结触发option条件:

  1. 前提是发生跨域请求
  2. 触发一定条件,例如post请求的Request headers 的 content-type为application/json
    注意:1. 必须是request header ; 2.get请求设置不了content-type,因为get会把参数拼接在url上。

设置request headers是否生效,和当前设置的参数还有关系,axios在内部会给你进行合理化的处理。

在post请求中设置request headers,如果设置data为对象,则content-type默认为application/json,如果data为字符串,则content-type默认为application/x-www-form-urlencoded;当然也可以手动设置headers: { ‘Content-Type’: ‘application/json’ },前提是设置了data。


一. 偶然的相遇——options请求

最近写的项目,应用里所有的ajax请求都发送了2遍。由于新项目,基础模块是新搭的,所以出现一些奇葩问题也是意料之中,啊终于第一次在chrome的devTools遇见了活的options请求。
在这里插入图片描述

1.1 第1次请求

这里首先发送了一次额外的options请求,在浏览器里看到请求request header 和 response header的信息如下:
(1)预检请求头request header的关键字段:
在这里插入图片描述
服务器基于从预检请求头部获得的信息来判断,是否接受接下来的实际请求。

在这里插入图片描述

(2)预检响应头response header的关键字段:
在这里插入图片描述
此次OPTIONS请求返回了响应头的内容,但没有返回响应实体response body内容。
在这里插入图片描述

1.2 第2次请求

这是本来要发送的请求,如图所示是普通的post请求。其中Content-Type的application/json是此次和后端约定的请求内容格式,这个也是后面讲到为什么会发送options请求的原因之一。

注意:这里截图不对,应该是在request headers里!!!
在这里插入图片描述

二. 关于OPTIONS请求

从很多资料我们可以了解到使用OPTIONS方法对服务器发起请求,可以检测服务器支持哪些 HTTP 方法。但是这次我们并没有主动去发起OPTIONS请求,那OPTIONS请求为何会自动发起?

2.1 OPTIONS请求自动发起

MDN的CORS一文中提到:

规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。

所以这个跨域请求触发了浏览器自动发起OPTIONS请求,看看此次跨域请求具体触发了哪些条件。

2.2 跨域请求时,OPTIONS请求触发条件

在这里插入图片描述
由于修改了post类型请求的Content-Type为application/json,触发了CORS预检请求。

三. 优化OPTIONS请求:Access-Control-Max-Age 或者 避免触发

可见一旦达到触发条件,跨域请求便会一直发送2次请求,这样增加的请求数是否可优化呢?答案是可以,OPTIONS预检请求的结果可以被缓存。

Access-Control-Max-Age这个响应首部表示 preflight request (预检请求)的返回结果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息) 可以被缓存的最长时间,单位是秒。(MDN)

如果值为 -1,则表示禁用缓存,每一次请求都需要提供预检请求,即用OPTIONS请求进行检测。

评论区的朋友提醒了,尽量避免不要触发OPTIONS请求,上面例子中把content-type改掉是可以的。在其他场景,比如跨域并且业务有自定义请求头的话就很难避免了。现在使用的axios或者superagent等第三方ajax插件,如果出现CORS预检请求,可以看看默认配置或者二次封装是否规范。

转载自:https://juejin.cn/post/6844903821634699277

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

. . . . .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值