【爬虫】关于 HTTP 的 OPTIONS 请求
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 请求相关推荐
- 爬虫python爬取页面请求_Python网络爬虫第三弹《爬取get请求的页面数据》
一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...
- 仅发送options请求,没有发送post解决方案
仅发送options请求,没有发送post解决方案 参考文章: (1)仅发送options请求,没有发送post解决方案 (2)https://www.cnblogs.com/zhangzs000/p ...
- 使用axios时遇到的Request Method: OPTIONS请求,会同时发送两次请求问题
新接手的一个项目中,发现一些接口在请求时,会自动发送一个 Request Method: OPTIONS 的请求,我查了一遍代码,不是代码中写明的.就上网搜了一下,网上给出的解释涉及到了两个关键词: ...
- corspost请求失败_vue项目CORS跨域请求500错误,post请求变options请求
vue项目CORS跨域请求500,post请求变options请求,到底是什么情况. 提示:以下内容是一个非专业开发的我对跨域的理解,并不10分准确. 一.先介绍为什么明明发送的是Post请求,为什么 ...
- 爬虫python爬取页面请求_03 Python网络爬虫第三弹《爬取get请求的页面数据》,urllib...
一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...
- python爬虫post请求_Python爬虫之GET和POST请求
爬虫--GET请求和POST请求 urllib.parse.urlencode()和urllib.parse.unquote() 编码工作使用urllib.parse的urlencode()函数,帮我 ...
- ios 请求头设置token_HTTP中的OPTIONS请求
前言 http请求之前已经接触了很多,但是这个options请求我还是第一次,刚来到公司的时候进行调试,发现NetWork里,每个请求在发出之前都会先发送一个options请求,第二个才是正常的请求. ...
- java option请求_java – 如何说服spring 4.2将OPTIONS请求传递给控制器
我们在控制器上使用带有@RestController注释的spring mvc,我们正在处理控制器中的授权.我们使用相同的代码来设置响应CORS飞行前请求的允许方法.为实现这一目标,我们有: 在调度程 ...
- Chrome不显示OPTIONS请求的解决方法2021版chrome90
在chrome90上之前展示跨域请求预检请求的方法失效了: 在chrome地址栏总输入 chrome://flags/#out-of-blink-cors 将其设置为Disabled后重启浏览器 在c ...
最新文章
- 科学解释超级计算机,超级计算机:彻底“改变”科学
- 【Groovy】Groovy 方法调用 ( 字符串切割 | 使用 Java 语法切割字符串 | 使用 Groovy 语法切割字符串直接为变量赋值 | 数组赋值给变量 变量个数小于等于数组长度 )
- 重启openssl服务linux,Nginx的启动、停止与重启---linux
- Python基础之 Django视图和 URL 配置
- 刘若英《爱情限量版》摘录
- Angular应用的入口
- 使用正则表达式解析http请求url中的参数和参数值
- django 实现电子支付功能
- WebLogic清理缓存
- Java Web学习笔记03:JSP元素
- bzoj1449 [JSOI2009]球队收益
- Vissim 中动态交通路径选择
- c# Open Source
- Android 自己主动化測试之------ Monkey工具
- 单片机通过蜂鸣器播放任意音乐代码实现(1):单片机代码部分
- png转jpg java_怎么把图片PNG格式转换成JPG格式?
- LaTex编辑器编辑公式
- 来自百度的移动应用框架Clouda:快速开发,一键部署BAE
- 小程序账号注册完整流程
- Ubuntu卸载、安装