OPTIONS 请求引发的分析
阅读提纲:
- 为什么会出现 OPTIONS 请求?
- 什么情况下会出现 OPTIONS 请求?
- OPTIONS 请求会发送什么内容?
跨域前端访问后端时,所有的 Ajax HTTP 请求都会先发送一个 OPTIONS 请求,接下来再发送真实请求。图略。
那么问题来了:为什么会出现 OPTIONS 请求?什么情况下会出现 OPTIONS 请求?OPTIONS 请求会发送什么内容?
为什么会出现 OPTIONS 请求?
当 HTTP 请求跨域时,浏览器会自动先发送一个 OPTIONS 请求(预检请求,preflight request)到相同的目标地址,目的是获知服务端是否允许浏览器发送该跨域请求,因为某些 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求)可能对服务器数据产生副作用。
什么是跨域?
当请求端和目标端的 URL 的协议或域名或端口有任意一项不一致,则该请求跨域。
比如下表中的 URL1 和 URL2 都属于跨域:
|
URL1
|
URL2
|
原因
|
|---|---|---|
| http://localhost/ | https://localhost/ | 协议不同 |
| http://localhost/ | http://127.0.0.1/ | 域名不同 |
| http://localhost:80/ | http://localhost:81/ | 端口不同 |
什么情况下会出现 OPTIONS 请求?
其实发送 OPTIONS 请求还是有一定条件的。当请求满足下述任一条件时,即应首先发送预检请求:
1、使用了下面任一 HTTP 方法:
PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH
2、人为设置了对 CORS 安全的首部字段集合之外的其他首部字段。该集合为:
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
4、请求中的XMLHttpRequestUpload 对象注册了任意多个事件监听器。
5、请求中使用了ReadableStream对象。
OPTIONS 请求会发送什么内容?
OPTIONS 请求发送的请求信息如下图所示:

其中最重要的是:
Access-Control-Request-Method: GET
Access-Control-Request-Headers: accesstoken, refreshtoken
其中:
“Access-Control-Request-Method”指令告诉服务器实际发送的请求方法是“GET”,“Access-Control-Request-Headers”指令告诉服务器实际发送的请求头会包含这两个字段。
如果服务器同意接收客户端这个请求,就会返回如下两个字段:
Access-Control-Allow-Methods: GET
Access-Control-Allow-Headers: accesstoken, refreshtoken
如果服务器允许客户端的域访问,则会返回如下字段(假设客户端的域是 http://loclahost.cn):
Access-Control-Allow-Origin: http://localhost.cn
如果服务器允许客户端携带凭证(比如会话ID等 COOKIE 信息),则会返回如下字段:
Access-Control-Allow-Credentials: true
参考:
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Preflighted_requests
OPTIONS 请求引发的分析的更多相关文章
- Laravel 处理 Options 请求的原理以及批处理方案
0. 背景 在前后端分离的应用中,需要使用CORS完成跨域访问.在CORS中发送非简单请求时,前端会发一个请求方式为OPTIONS的预请求,前端只有收到服务器对这个OPTIONS请求的正确响应,才会发 ...
- Laravel + Vue 之 OPTIONS 请求的处理
问题: 在 Vue 对后台的请求中,一般采用 axios 对后台进行 Ajax 交互. 交互发生时,axios 一般会发起两次请求,一次为 Options 试探请求,一次为正式请求. 由此带来的问题是 ...
- AJAX请求中出现OPTIONS请求
背景 有一个前后端分离的VUE项目来发送ajax请求, 查看Nginx日志或使用Chrome Dev Tools查看请求发送情况时, 会看到每次调后台API的请求之前, 都会发送一个OPTIONS请求 ...
- http请求发生了两次(options请求)
前言 自后台restful接口流行开来,请求了两次的情况(options请求)越来越普遍.笔者也在实际的项目中遇到过这种情况,做一下整理总结. 文章书写思路: 为什么发生两次请求 http的请求方式, ...
- "Chrome的network中无法显示OPTIONS请求"的解决方案
目录 #事故现场 #分析及解决方法 #参考 #事故现场 在前端发送一个跨域请求的时候,要先发送个options请求,从而获知服务端是否允许该跨域请求. 跨域资源共享标准新增了一组 HTTP 首部字段, ...
- 一个Option请求引发的深度解析
在当前项目中,前端通过POST方式访问后端的REST接口时,发现两条请求记录,一条请求的Request Method为Options,另一条请求的Reuest Method为Post.想要解决这个疑惑 ...
- Tomcat处理HTTP请求源码分析(下)
转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...
- 一次http完整的请求tcp报文分析
一次http请求的报文分析 数据包如下: 第一个包113.31的主机(下边称之为客户端)给114.80的主机(下边称之为服务器)发送一个syn包请求建立连接 第二个包服务器回复客户端syn+ack表示 ...
- 为什么会有OPTIONS请求
在做项目时,很多时候发送一个post请求,是先发送一个option请求,然后再发送post请求,一直这么用之前也没有仔细思考,今天有时间,好好了解一下为什么会多一次请求. 疑问1:什么是options ...
随机推荐
- python爬虫——简易天气爬取
通过爬虫,抓取http://www.weather.com.cn的天气信息 功能——输入城市代码,获取当日天气,简单的beautifulsoup和requests实现.(城市代码可百度查询,不全部展示 ...
- Jetpack系列:Paging组件帮你解决分页加载实现的痛苦
相信很多小伙伴们在项目实战中,经常会用到界面的分页显示.加载更多等功能.需要针对具体功能做针对性开发和调试,耗时耗力. Paging组件的使用将这部分的工作简化,从而让开发者更专注于业务的具体实现.下 ...
- docker 使用及基本命令
一.docker简单使用 a.列出镜像 docker images b.从docker hub拉取最新版本镜像 docker pull xxx 错误: Error response from daem ...
- js匿名函数自执行的好处
我们知道,在创建一个函数时如果要用到变量来存取信息的话,要尽量使用局部变量. 因为一方面局部变量会随着函数的执行结束被销毁:另一方面在不执行函数的时候也不会创建这个局部变量,对节省空间资源有很大的好处 ...
- python语言程序设计基础(嵩天)第四章课后习题部分答案
p121: *题4.1:猜数字游戏.在程序中预设一个0~9之间的整数,让用户通过键盘输入所猜的数,如果大于预设的数,显示“遗憾,太大了!”:小于预设的数,显示“遗憾,太小了!”,如此循环,直至猜中该数 ...
- Windows中利用共享内存来实现不同进程间的通信
Windows中利用共享内存来实现不同进程间的通信 一.msdn详细介绍 https://docs.microsoft.com/zh-cn/windows/win32/memory/sharing-f ...
- springboot使用百度富文本UEditor遇到的问题一览(springboot controller中request.getInputStream无法读取)
先吐槽一下UEditor作为一个前端的js类库,非要把4种后端的代码给出来,而实际生产中用的框架不同,其代码并不具有适应性.(通常类似其它项目仅仅是给出数据交互的规范.格式,后端实现就可以自由定制) ...
- Kafka常用运维操作
创建主题kafka-topics.sh --zookeeper localhost:2181 --create --topic my-topic --replication-factor 3 --pa ...
- 最强最全的Java后端知识体系
目录 最全的Java后端知识体系 Java基础 算法和数据结构 Spring相关 数据库相关 方法论 工具清单 文档 @(最强最全的Java后端知识体系) 最全的Java后端知识体系 最全的Java后 ...
- Oracle VM VirtualBOX桥接网卡
1.在VirtualBOX设置中的网络菜单,连接方式选择桥接网卡 2.启动系统,设置静态IP sudo vim /etc/network/interfaces auto enp0s3 ...