首页 > 其他分享 >options请求有什么用

options请求有什么用

时间:2022-12-06 17:15:19浏览次数:45  
标签:Control 跨域 什么 预检 Access options 请求

平常发现项目中浏览器好多个请求都会预先发起一个options类型的请求,没有返回数据。那么这个请求有什么用?

 

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

 

一、什么是 options 请求

HTTP 的 OPTIONS 方法 用于获取目的资源所支持的通信选项。客户端可以对特定的 URL 使用 OPTIONS 方法,也可以对整站(通过将 URL 设置为"*")使用该方法。(简而言之,就是可以用 options 请求去嗅探某个请求在对应的服务器中都支持哪种请求方法)。

原因:

这是因为在跨域的情况下,在浏览器发起"复杂请求"时主动发起的。跨域共享标准规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。

二、简单请求和复杂请求

某些请求不会触发CORS预检请求,这样的请求一般称为 “简单请求” ,而会触发预检的请求则是 “复杂请求” 。

简单请求

  • 请求方式为GET、HEAD、POST时的请求;
  • 认为设置规范集合之内的首部字段,如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;
  • 请求中的任意 XMLHttpRequestUpload对象均没有注册任何事件监听器;
  • 请求中没有使用 ReadableStream对象。

复杂请求

  • PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH;
  • 人为设置了以下集合之外首部字段,即简单请求外的字段;
  • Content-Type 的值不属于下列之一,即application/x-www-form-urlencoded、multipart/form-data、text/plain。

三、option关键字段

request header 的关键字段

Access-Control-Request-Method告知服务器, 实际请求将使用POST方法
Access-Control-Request-Headers告知服务器, 实际请求将携带的自定义请求首部字段

 

response header 的关键字段

Access-Control-Allow-Methods表明服务 器允许客户端使用什么方法发起请求
Access-Control-Allow-Origin  允许跨域请求的域名,如果要允许所有域名则设置为*
Access-Control-Allow-Headers将实际请 求所携带的首部字段告诉服务器
Access-Control-Max-Age 指定了预检请求的结果能够被缓存多久

四、Options 请求优化

当发起跨域请求时,简单请求只发起一次请求;复杂请求则需要2次,先发起options请求,确认目标资源是否支持跨域,浏览器会根据服务端响应的header自动处理剩余的请求,如果响应支持跨域,则继续发出正常请求;不支持的话,会在控制台显示错误。
所以,当触发预检时,跨域请求便会发送2次请求,增加请求次数,同时,也延迟了请求真正发起的时间,会严重地影响性能。

 

方法一: 用其它的跨域方式做跨域请求,将复杂请求转为简单请求,比如JSONP等;
方法二: 对 options 请求进行缓存。
服务器端设置 Access-Control-Max-Age 字段,那么当第一次请求该 URL 时会发出 OPTIONS 请求,浏览器会根据返回的 Access-Control-Max-Age 字段缓存该请求的 OPTIONS 预检请求的响应结果(具体缓存时间还取决于浏览器的支持的默认最大值,取两者最小值,一般为 10 分钟)。在缓存有效期内,该资源的请求(URL 和 header 字段都相同的情况下)不会再触发预检。(chrome 打开控制台可以看到,当服务器响应 Access-Control-Max-Age 时只有第一次请求会有预检,后面不会了。注意要开启缓存,去掉 disable cache 勾选。)

 

标签:Control,跨域,什么,预检,Access,options,请求
From: https://www.cnblogs.com/Timeouting-Study/p/16955832.html

相关文章

  • 技术对企业全面预算管理系统意味着什么?
    在这个科技突飞猛进的时代,跟上最新的技术趋势成为了企业业务的重要组成部分。对于财务人员来讲,系统的技术性升级也成为了现代科技背景下一个不容忽视的发展要点。在过去的十......
  • AI网关结合智慧路灯杆可以开发什么应用
    AI智能网关,专为边缘端的智能识别、智能管控应用设计,能够充分发挥边缘数据采集—边缘端计算处理的快速高效优势,减少数据传输量和云端计算量,提高物联网设施的响应效率。AI网关......
  • IDEA 中 git Merge Select into Current 和 Pull into Current using merge有什么区别
     今天同事更代码,问我个问题蒙住了,问这俩有啥区别?平时没注意,突然有点答不上来,感觉确实翻译过来是一样的,没区别。  先说结论,MergeSelectintoCurrent  是将本地......
  • OpenClash 订阅信息正常,配置文件正常,为什么上不了国外网站?
    环境:ESXI虚拟X64硬件,系统OpenWrtX64版本。1、注意查看代理模式(自己在全局设置中设置的系统启动默认模式),尽量选择Rule模式;2、检查OpenWrt的NTP功能,确认NTP客户端功能为关......
  • 什么是Barr-C?
    Barr-C是BarrGroup的编码标准,旨在减少嵌入式软件中的漏洞,并引入风格指南,提高可维护性和可移植性。在这里,我们将阐释什么是Barr-C,开发人员如何使用BARR-C:1018检测C语言所......
  • IPv6比IPv4有什么优点?我国IPv6发展现状-中科三方
    《推进互联网协议第六版(IPv6)规模部署行动计划》(以下简称《行动计划》)发布实施以来,政府部门、基础电信企业、互联网企业、通信设备与服务提供商、相关中央企业、事业单位、......
  • 什么是UML
    一:UML简介   UML是一种面向对象的建模语言,它的主要作用是帮助用户对软件系统进行面向对象的描述和建模;它可以描述这个软件从需求分析直到实现和测试的过程。二:UML的......
  • 为什么推荐Kestrel作为网络开发框架
    为什么推荐Kestrel网络框架千千万万,在dotnet平台,我们可以直接手撸Socket,也可以基于dotnetty来开发,或者选择某些第三方类似于dotnetty的网络库,为何我要推荐Kestrel呢?1使......
  • 什么是SFP光模块?SFP光模块小知识介绍!
    SFP光模块是SFP封装的热插拔小封装模块,目前最高速率可达10.3G,接口为LC。SFP光模块主要由激光器构成。SFP分类可分为速率分类、波长分类、模式分类。接下来就由飞畅科技的小......
  • 有什么轻量级的大数据技术
    一、大数据形式流行的大数据技术有Hadoop,Storm,Hive、Spark等,这些都是大集群方案,适合有海量规模数据的巨大企业。实际上,流行的大数据技术通常也源自这类头部互联网企业。......