阅读提纲:

  • 为什么会出现 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 请求引发的分析的更多相关文章

  1. Laravel 处理 Options 请求的原理以及批处理方案

    0. 背景 在前后端分离的应用中,需要使用CORS完成跨域访问.在CORS中发送非简单请求时,前端会发一个请求方式为OPTIONS的预请求,前端只有收到服务器对这个OPTIONS请求的正确响应,才会发 ...

  2. Laravel + Vue 之 OPTIONS 请求的处理

    问题: 在 Vue 对后台的请求中,一般采用 axios 对后台进行 Ajax 交互. 交互发生时,axios 一般会发起两次请求,一次为 Options 试探请求,一次为正式请求. 由此带来的问题是 ...

  3. AJAX请求中出现OPTIONS请求

    背景 有一个前后端分离的VUE项目来发送ajax请求, 查看Nginx日志或使用Chrome Dev Tools查看请求发送情况时, 会看到每次调后台API的请求之前, 都会发送一个OPTIONS请求 ...

  4. http请求发生了两次(options请求)

    前言 自后台restful接口流行开来,请求了两次的情况(options请求)越来越普遍.笔者也在实际的项目中遇到过这种情况,做一下整理总结. 文章书写思路: 为什么发生两次请求 http的请求方式, ...

  5. "Chrome的network中无法显示OPTIONS请求"的解决方案

    目录 #事故现场 #分析及解决方法 #参考 #事故现场 在前端发送一个跨域请求的时候,要先发送个options请求,从而获知服务端是否允许该跨域请求. 跨域资源共享标准新增了一组 HTTP 首部字段, ...

  6. 一个Option请求引发的深度解析

    在当前项目中,前端通过POST方式访问后端的REST接口时,发现两条请求记录,一条请求的Request Method为Options,另一条请求的Reuest Method为Post.想要解决这个疑惑 ...

  7. Tomcat处理HTTP请求源码分析(下)

    转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...

  8. 一次http完整的请求tcp报文分析

    一次http请求的报文分析 数据包如下: 第一个包113.31的主机(下边称之为客户端)给114.80的主机(下边称之为服务器)发送一个syn包请求建立连接 第二个包服务器回复客户端syn+ack表示 ...

  9. 为什么会有OPTIONS请求

    在做项目时,很多时候发送一个post请求,是先发送一个option请求,然后再发送post请求,一直这么用之前也没有仔细思考,今天有时间,好好了解一下为什么会多一次请求. 疑问1:什么是options ...

随机推荐

  1. TensorFlow2.0(五):张量限幅

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  2. Kafka 学习笔记之 架构

    Kafka的概念: 1. AMQP协议 Advanced Message Queuing Protocol (高级消息队列协议) The Advanced Message Queuing Protoc ...

  3. WordPress 使用本地化的 emoji 表情包

    WordPress 结合使用 Native Emoji 和 WP Local Emoji 两个插件,可以达到使用本地化的 emoji 表情包的目的. 安装好上述两个插件并且启用: 为了使 Native ...

  4. 为什么用Markdown,而不用Word?

    写博客.写文章比较多的人都知道 Markdown 是什么. Markdown 是一种轻量级标记语言,创始人为 John Gruber.它允许人们「使用易读易写的纯文本格式编写文档,然后转换成有效的 X ...

  5. pycharm导入自己写的包的时候,不能识别模块的解决办法

    今天用写selenium脚本的时候导入自己统计目录下的模块时,出错,明明存在但是报错说模块不存在,找了半天终于找到解决方案,顺便记录一下吧 pycharm不会将当前文件目录自动加入自己的sourse_ ...

  6. Web开发小贴士 -- 全面了解Cookie

    一.Cookie的出现 浏览器和服务器之间的通信少不了HTTP协议,但是因为HTTP协议是无状态的,所以服务器并不知道上一次浏览器做了什么样的操作,这样严重阻碍了交互式Web应用程序的实现. 针对上述 ...

  7. 分库分表(6)--- SpringBoot+ShardingSphere实现分表+ 读写分离

    分库分表(6)--- ShardingSphere实现分表+ 读写分离 有关分库分表前面写了五篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理论 ...

  8. 不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤

    数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查. 在数据库的增删改查操作中,使用最频繁的就是查询操作.而在所有查询操作中,统计数量操作更 ...

  9. 通过机器学习的线性回归算法预测股票走势(用Python实现)

    在本人的新书里,将通过股票案例讲述Python知识点,让大家在学习Python的同时还能掌握相关的股票知识,所谓一举两得.这里给出以线性回归算法预测股票的案例,以此讲述通过Python的sklearn ...

  10. 面试官,Java8 JVM内存结构变了,永久代到元空间

    在文章<JVM之内存结构详解>中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化.作为面试官如果你还不知道,那么面试过程中是不是有些露怯? ...