HTTP 的 OPTIONS 方法


用于获取目的资源所支持的通信选项。客户端可以对特定的 URL 使用 OPTIONS 方法,也可以对整站(通过将 URL 设置为“*”)使用该方法;

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

前端一般不会主动发起这个请求,但是通过F12 debug页面,一般可以看到 相同的请求会有两次,其中一次的 Request Method 是 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 对象。

复杂请求

  • 使用了下面任一 HTTP 方法,PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH

  • 人为设置了以下集合之外首部字段,即简单请求外的字段

  • Content-Type 的值不属于下列之一,即application/x-www-form-urlencoded、multipart/form-data、text/plain

options 关键的请求头字段


request header 的关键字段

  • Access-Control-Request-Method:告知服务器,实际请求将使用 POST 方法

  • Access-Control-Request-Headers:告知服务器,实际请求将携带的自定义请求首部字段
    如:

    Access-Control-Request-Method: POST
    Access-Control-Request-Headers: X-PINGOTHER, Content-Type
    

response header 的关键字段

  • Access-Control-Allow-Methods 表明服务器允许客户端使用什么方法发起请求

  • Access-Control-Allow-Origin 允许跨域请求的域名,如果要允许所有域名则设置为 *

  • Access-Control-Request-Headers 将实际请求所携带的首部字段告诉服务器

  • Access-Control-Max-Age 指定了预检请求的结果能够被缓存多久

Options 请求优化


当我们发起跨域请求时,如果是简单请求,那么我们只会发出一次请求,但是如果是复杂请求则先发出 options 请求,用于确认目标资源是否支持跨域,然后浏览器会根据服务端响应的 header 自动处理剩余的请求,如果响应支持跨域,则继续发出正常请求,如果不支持,则在控制台显示错误。

由此可见,当触发预检时,跨域请求便会发送 2 次请求,既增加了请求数,也延迟了请求真正发起的时间,严重影响性能。

所以,我们可以优化 Options 请求,主要有 2 种方法。

1、转为简单请求,如用 JSONP 做跨域请求
对 options 请求进行缓存,服务器端设置 Access-Control-Max-Age 字段,那么当第一次请求该 URL 时会发出 OPTIONS 请求,浏览器会根据返回的 Access-Control-Max-Age 字段缓存该请求的 OPTIONS 预检请求的响应结果(具体缓存时间还取决于浏览器的支持的默认最大值,取两者最小值,一般为 10 分钟)。

2、在缓存有效期内,该资源的请求(URL 和 header 字段都相同的情况下)不会再触发预检。(chrome 打开控制台可以看到,当服务器响应 Access-Control-Max-Age 时只有第一次请求会有预检,后面不会了。注意要开启缓存,去掉 disable cache 勾选。)

总结


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

参考资料


https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS#Preflighted_requests
https://zhuanlan.zhihu.com/p/70032617

【爬虫】关于 HTTP 的 OPTIONS 请求相关推荐

  1. 爬虫python爬取页面请求_Python网络爬虫第三弹《爬取get请求的页面数据》

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  2. 仅发送options请求,没有发送post解决方案

    仅发送options请求,没有发送post解决方案 参考文章: (1)仅发送options请求,没有发送post解决方案 (2)https://www.cnblogs.com/zhangzs000/p ...

  3. 使用axios时遇到的Request Method: OPTIONS请求,会同时发送两次请求问题

    新接手的一个项目中,发现一些接口在请求时,会自动发送一个 Request Method: OPTIONS 的请求,我查了一遍代码,不是代码中写明的.就上网搜了一下,网上给出的解释涉及到了两个关键词: ...

  4. corspost请求失败_vue项目CORS跨域请求500错误,post请求变options请求

    vue项目CORS跨域请求500,post请求变options请求,到底是什么情况. 提示:以下内容是一个非专业开发的我对跨域的理解,并不10分准确. 一.先介绍为什么明明发送的是Post请求,为什么 ...

  5. 爬虫python爬取页面请求_03 Python网络爬虫第三弹《爬取get请求的页面数据》,urllib...

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  6. python爬虫post请求_Python爬虫之GET和POST请求

    爬虫--GET请求和POST请求 urllib.parse.urlencode()和urllib.parse.unquote() 编码工作使用urllib.parse的urlencode()函数,帮我 ...

  7. ios 请求头设置token_HTTP中的OPTIONS请求

    前言 http请求之前已经接触了很多,但是这个options请求我还是第一次,刚来到公司的时候进行调试,发现NetWork里,每个请求在发出之前都会先发送一个options请求,第二个才是正常的请求. ...

  8. java option请求_java – 如何说服spring 4.2将OPTIONS请求传递给控制器

    我们在控制器上使用带有@RestController注释的spring mvc,我们正在处理控制器中的授权.我们使用相同的代码来设置响应CORS飞行前请求的允许方法.为实现这一目标,我们有: 在调度程 ...

  9. Chrome不显示OPTIONS请求的解决方法2021版chrome90

    在chrome90上之前展示跨域请求预检请求的方法失效了: 在chrome地址栏总输入 chrome://flags/#out-of-blink-cors 将其设置为Disabled后重启浏览器 在c ...

最新文章

  1. 科学解释超级计算机,超级计算机:彻底“改变”科学
  2. 【Groovy】Groovy 方法调用 ( 字符串切割 | 使用 Java 语法切割字符串 | 使用 Groovy 语法切割字符串直接为变量赋值 | 数组赋值给变量 变量个数小于等于数组长度 )
  3. 重启openssl服务linux,Nginx的启动、停止与重启---linux
  4. Python基础之 Django视图和 URL 配置
  5. 刘若英《爱情限量版》摘录
  6. Angular应用的入口
  7. 使用正则表达式解析http请求url中的参数和参数值
  8. django 实现电子支付功能
  9. WebLogic清理缓存
  10. Java Web学习笔记03:JSP元素
  11. bzoj1449 [JSOI2009]球队收益
  12. Vissim 中动态交通路径选择
  13. c# Open Source
  14. Android 自己主动化測试之------ Monkey工具
  15. 单片机通过蜂鸣器播放任意音乐代码实现(1):单片机代码部分
  16. png转jpg java_怎么把图片PNG格式转换成JPG格式?
  17. LaTex编辑器编辑公式
  18. 来自百度的移动应用框架Clouda:快速开发,一键部署BAE
  19. 小程序账号注册完整流程
  20. Ubuntu卸载、安装

热门文章

  1. java-net-php-python-jsp员工考勤管理系统计算机毕业设计程序
  2. 28 APRIL 2021 VOL 6, ISSUE 53
  3. 夏凉被适宜室内多少度
  4. 为什么你值得入手一个 Macbook?
  5. IDEA启动tomcat 端口1099被占用(1099 is already in use)
  6. It’s not what I wanted
  7. Lotus Blossom 行动分析
  8. 网络安全管理十大注意事项
  9. 【前端Web】Jquery实现的四款牛B的时间轴
  10. 破解拉新获客难题,捷径系统-健身房系统让生意更简单