美文网首页
options请求问题

options请求问题

作者: 他爱在黑暗中漫游 | 来源:发表于2021-05-13 18:49 被阅读0次

最近在项目中遇到一个问题,发送请求时,浏览中显示发送了两个请求,一个是OPTIONS,另一个是实际的请求。然而后台在处理OPTIONS请求的时候,对请求进行了拦截,导致实际请求未能进行。所以需要后台排除下options请求,如下图


11260966-76ddf6be426bb043.png

1.OPTIONS请求为何会自动发起?

MDN的CORS一文中提到:

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

浏览器将CORS请求分为两类:简单请求(simple request)和非简单请求(not-simple-request),简单请求浏览器不会预检,而非简单请求会预检。这两种方式怎么区分?

2. 跨域请求时,OPTIONS请求触发条件

  1. 使用了下面任一HTTP 方法:
    PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH

  2. 人为设置了以下集合之外首部字段:
    Accept/Accept-Language/Content-Language/Content-Type/DPR/Downlink/Save-Data/Viewport-Width/Width

  3. Content-Type 的值不属于下列之一:
    application/x-www-form-urlencoded、multipart/form-data、text/plain

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

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

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

response.png

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

参考
https://juejin.cn/post/6844903821634699277
https://segmentfault.com/a/1190000021766588

相关文章

  • options请求问题

    最近在项目中遇到一个问题,发送请求时,浏览中显示发送了两个请求,一个是OPTIONS,另一个是实际的请求。然而后台...

  • 跨域时发送预检请求,tp5的restful无options方法的

    问题:使用vue-resource发送delete请求时报options请求404 思考:明明发送的是delete...

  • ab压测基本命令

    ab [options] url options. -n 请求数量-c 并发数-H 请求头-p POS...

  • http跨域预检问题

    昨天的项目碰到个比较棘手的问题。前端发送ajax请求时,总会在真实请求前多一次请求方法为OPTIONS的请求,而且...

  • 说说对options 的理解

    什么是options请求,简单的说就是可以用 options 请求去嗅探某个请求在对应的服务器中都支持哪种请求方法...

  • 预检请求

    问题:每次发起请求,同一条url有两条请求第一条请求Method是OPTIONS请求,第二条请求Method才是实...

  • CORS 比较详细的说明

    一个CORS请求的流程 发送一个预检请求都为Options请求,因为Options请求不会对服务器做出任何改动。且...

  • OPTIONS 请求方法

    OPTIONS请求方法的主要用途有两个: 1、获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。 2、用来...

  • options方式请求

    后台写错误了 第二次请求的请求头里如果有Content-Type:application/json就会请求两次

  • OPTIONS 请求失败

    这个异常也是比较特殊的,所以我觉得有必要贡献出来。 背景 首先,无论客户端或者服务端,都已经做好可跨域请求的相关代...

网友评论

      本文标题:options请求问题

      本文链接:https://www.haomeiwen.com/subject/hsexjltx.html