# [跨域中option请求详解](https://www.cnblogs.com/zhaodagang8/p/11275685.html)
在正式跨域的请求前,浏览器会根据需要,发起一个“PreFlight”(也就是Option请求),用来让服务端返回允许的方法(如get、post),被跨域访问的Origin(来源,或者域),还有是否需要Credentials(认证信息)
三种场景:
1\. 如果跨域的请求是Simple Request(简单请求 ),则不会触发“PreFlight”。Mozilla对于简单请求的要求是:
以下三项必须都成立:
1\. 只能是Get、Head、Post方法
2\. 除了浏览器自己在Http头上加的信息(如Connection、User-Agent),开发者只能加这几个:Accept、Accept-Language、Content-Type、。。。。
3\. Content-Type只能取这几个值:
* `application/x-www-form-urlencoded`
* `multipart/form-data`
* `text/plain`
一、为什么会出现options请求呢?
跨域请求中,options请求是浏览器自发起的preflight request(预检请求),以检测实际请求是否可以被浏览器接受。
preflight request请求报文中有两个需要关注的首部字段:
(1)Access-Control-Request-Method:告知服务器实际请求所使用的HTTP方法;
(2)Access-Control-Request-Headers:告知服务器实际请求所携带的自定义首部字段。
同时服务器也会添加origin header,告知服务器实际请求的客户端的地址。服务器基于从预检请求获得的信息来判断,是否接受接下来的实际请求。
服务器所返回的Access-Control-Allow-Methods首部字段将所有允许的请求方法告知客户端,返回将所有Access-Control-Request-Headers首部字段将所有允许的自定义首部字段告知客户端。此外,服务器端可返回Access-Control-Max-Age首部字段,允许浏览器在指定时间内,无需再发送预检请求,直接用本次结果即可。
在我们开发过程中出现的浏览器自发起的options请求就是上面的第二种情况。实际上,跨域请求中的”复杂请求”发出前会进行一次方法是options的preflight request。
二、当跨域请求是简单请求时不会进行preflight request,只有复杂请求才会进行preflight request。
跨域请求分两种:简单请求、复杂请求;
符合以下任一情况的就是复杂请求:
1.使用方法put或者delete;
2.发送json格式的数据(content-type: application/json)
3.请求中带有自定义头部;
除了满足以上条件的复杂请求其他的就是简单请求喽!
三、为什么跨域的复杂请求需要preflight request?
复杂请求可能对服务器数据产生副作用。例如delete或者put,都会对服务器数据进行修改,所以在请求之前都要先询问服务器,当前网页所在域名是否在服务器的许可名单中,服务器允许后,浏览器才会发出正式的请求,否则不发送正式请求。
- 后端
- git自动化部署
- yii 事件
- 设计模式
- composer加速
- PHP异常抛出处理捕捉处理
- Yii异常抛出
- php运行模式
- 前端
- JS篇
- 数组去重
- 移动端还是pc端判断
- 常见字符串数组函数
- set
- input 只能大于0的两位小数
- CSS篇
- 绝对定位、固定定位和z-index
- 伪类和伪元素的区别
- css垂直居中
- input 光标位置
- css 图片背景
- 父元素使用min-height:900,子元素1固定高度,另一个子元素2使用height:100%,为什么子元素2的高度为0
- 父元素设置min-height子元素设置100%问题
- hover 问题
- JQ 选择器选择style的display:none 的元素
- input number 输入正整数以及输入位数限制,取消input number的上下箭头
- float 浮动的理解
- css选择器优先级
- 如何实现居中
- zepto.js
- css
- Jquery
- flex 弹性布局
- vue框架
- vuex做登入状态(state)的管理
- 乱数假文 lorem
- input中只能输入整数。保留两位的小数
- docker
- mysql
- mysql安装
- 如何使用创建lnmp?
- docker-compose
- 目录设计
- docker速度太慢
- PHP
- php安装扩展的一般套路
- GET和POST的区别
- is_null, emtpy, isset
- RBAC
- :class
- 书籍
- BCMath 任意精度数学
- curl 上传文件
- php 流 stream
- 因为文件编码出现问题
- 其他
- 二叉树
- nginx
- 反爬虫
- 安装mysql5.7
- git回退
- baidu cloud book
- hash_table
- 一个yii项目
- component
- yii验证规则有哪些
- Yii执行流程
- Yii 中特殊行为 ActionFilter 的使用示例
- 如果 select(['']) 指定字段,返回的对象,其他字段填空值
- yii2 手动触发前端的表单验证
- Yii 验证规则失效,注意点 'skipOnEmpty'=>false
- 前端ajax验证
- Yii 前端js 手动触发验证和增加验证
- Yii 框架使用小集
- yii框架抛出异常时返回json格式数据
- yii集成jwt
- yii使用jwt做用户访问验证
- yii2 项目中加载不到gii ,asset
- phpstorm
- 使用phpsotrm做代码检查
- 永久许可
- Mysql 数据库
- 使用mysql
- 检索数据
- 存储过程:变量
- mysql 账号安全管理
- 重复插入时更新。 ON DUPLICATE KEY UPDATE 解析
- 分组之group_concat,之一
- 分组group_concat,之二
- MySQL-this is incompatible with sql_mode=only_full_group_by错误解决方案
- mysql事务嵌套
- mysql索引/优化
- order 排序指定数据排前面
- update 条件更新
- MySQL之You can't specify target table for update in FROM clause解决办法
- 新增MySQL用户
- 数据结构
- 图
- git
- ignore
- 合并分支
- angular
- Angular6的ngFor遍历对象数组
- 网络篇
- 跨域中option请求详解
- PHP 异常处理
- php中错误和异常处理
- 正则
- 正则表达式 获取JSON数据中value值
- window/linux 系统功能使用
- 使用Windows命令行启动关闭服务(net,sc用法
- Linux使用包括sh脚本
- shell脚本
- shell 脚本复习练习
- elasticsearch学习
- 查询
- 新建索引index,实战
- 总览
- 创建一个文档
- 一个laravel项目
- URL 的生成
- 面向对象
- 抽象类和接口的区别
- 静态函数
- 运维
- 开发环境