一、什么是options请求

在正式发起跨域http请求之前,浏览器会根据需要发起一次预检(option请求),用来让服务端返回请求允许的方法(如get、post),orgin(来源|域名),以及是否需要Credentials(认证信息)等。

二、什么情况下

浏览器将CORS请求分为两类:简单请求(simple request)和非简单请求(not-simple-request),简单请求浏览器不会预检,而非简单请求会预检。这两种方式怎么区分?

同时满足下列三大条件,就属于简单请求,否则属于非简单请求

  • 请求方式只能是:GET、POST、HEAD
  • HTTP请求头限制这几种字段:Accept、Accept-Language、Content-Language、Content-Type、Last-Event-ID
  • Content-type只能取:application/x-www-form-urlencoded、multipart/form-data、text/plain

三、简单请求 非简单请求

简单请求

对于简单请求,浏览器直接请求,会在请求头信息中,增加一个origin字段,来说明本次请求来自哪个源(协议+域名+端口)。服务器根据这个值,来决定是否同意该请求。服务器返回的响应会多几个和跨域相关的头信息字段

  • Access-Control-Allow-Origin:该字段是必须的,* 表示接受任意域名的请求,还可以指定域名
  • Access-Control-Allow-Credentials:该字段可选,是个布尔值,表示是否可以携带cookie,(注意:如果Access-Control-Allow-Origin字段设置*,此字段设为true无效)
  • Access-Control-Allow-Headers:表明服务器允许请求中携带字段 ,如Cache-Control、Content-Type、Expires等
  • Access-Control-Max-Age:有效时间,在有效时间内,浏览器无须为同一请求再次发起预检请求

非简单请求

非简单请求是对那种对服务器有特殊要求的请求,比如请求方式是PUT或者DELETE,或者Content-Type字段类型是application/json。都会在正式通信之前,增加一次HTTP请求,称之为预检。

浏览器会先询问服务器,当前网页所在域名是否在服务器的许可名单之中,服务器允许之后,浏览器会发出正式的XMLHttpRequest请求,否则会报错。(备注:之前碰到预检请求后端没有通过,就不会发正式请求)

就Content-Type为application/json为例:对比两张图片,一次预检请求,一 次正式请求:

很明显,请求头中预检请求不会携带cookie,正式请求会携带cookie和参数。一旦服务器通过了“预检”请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样

【注意】

若后端设置了拦截器拦截请求,并对不携带cookie或者token的请求不放行。此时应该考虑到放行options请求,因为该请求header中不会携带cookie或者token

跨域 options请求相关推荐

  1. 跨域OPTIONS请求

    vue前端调用了两个GET请求,都通过header传递参数,在前端打印两个请求headers参数是一样的,运行时其中一个能正常传递参数SessionId,另外一个则不能: 正常传递: 2022/06/ ...

  2. 跨域post请求实现方案小结--转

    [名词解释] 跨域:https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript 同源策略 ...

  3. 跨域 cors 请求两次_请求两次的故事-CORS

    跨域 cors 请求两次 The story of requesting twice, allow me to explain how it all began. 请求两次的故事,让我解释一下这是如何 ...

  4. iframe解决跨域ajax请求的方法

    iframe跨域的基本前提是,一个页面可以嵌套非同源站点的html文件,以及某一个域名下的html页面可以通过脚本向同域名服务器发出ajax请求.当一个域名为domain1下的页面A想要向domain ...

  5. 跨域(CORS)请求问题[No 'Access-Control-Allow-Origin' header is present on the requested resource]常见解决方案

    基本概念 跨域(CORS)请求:同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略, ...

  6. Ajax跨域post请求后端无法获取登录态原因及解决办法

    遇到个小坑,印象中不是第一次遇到了,记录一下:前后端分离时前端.后端不在同一个子域,跨域post请求后端无法获取登录态. 原因 后端通过cookie验证用户是否登录,跨域post不会自动携带上cook ...

  7. AJAX 跨域调用和 Java 跨域 发送请求

    AJAX 跨域调用 前台代码: Html代码   <script type="text/javascript" src="jquery-1.7.2.min.js&q ...

  8. 实现uniapp的app和小程序开发中能使用axios进行跨域网络请求,并支持携带cookie

    实现uniapp的app和小程序开发中能使用axios进行跨域网络请求,并支持携带cookie 1-使用npm install axios;命令安装axios 2-新建一个文件夹再建一个.js后缀文件 ...

  9. html form提交增加请求头,怎么给jquery跨域post请求添加头部信息?

    跨域,的整序大作站对近从体的家为宽应近从体的家服务器已开放请求接口,用$post可以成功,但是无法添加header信息,用$ajax的话会把post信息换成OPTIONS发送请求,data跟heade ...

最新文章

  1. ktt算法 约化_推荐系统的多目标优化(4)-PE-LTR
  2. [Java基础]Properties
  3. 生成多个 SSH-Key 、生成多个公钥和私钥
  4. sqlserverv中处理字符串包含、截取
  5. 数据结构与算法之-----总览
  6. HTML5+CSS大作业——清新春暖花开个人博客网站(6页)
  7. 超详细的Python安装和环境搭建教程
  8. 预见2022 | 吴晓波年终秀 附PPT
  9. python实现明星专家系统:人脸识别自动比对
  10. SpringBoot第二特性:Starter启动依赖_01_自己动手写一个Starter组件
  11. 前端实用的20个css技巧
  12. 当前NBIoT设备的省电技术之PSM/DRX/eDRX
  13. 笔记本写代码 屏幕尺寸_为什么笔记本电脑的屏幕尺寸如此奇怪?
  14. 仿新浪微博项目需求,及数据库建设
  15. 计算机提示msvcp110.dll丢失怎样修复?计算机中丢失msvcp110.dll,电脑找不到msvcp110.dll怎么办
  16. CEC13BenchMark测试
  17. Erlang中的nif
  18. 用弹性工作制留住员工
  19. 壁虎书4 Training Models
  20. 3.2.1 一篇文章完全掌握 RecycleView 的六大用法

热门文章

  1. 十二星座英文及其含义!
  2. 8*8led矩阵的滚动广告幕的c语言程序,用树莓派控制8*8led矩阵显示红心
  3. 新装服务器系统非常卡的原因
  4. 小程序流量主运营攻略
  5. 大学生活该怎么度过?
  6. 微信怎么备份聊天记录?2个办法轻松解决
  7. DeblurGAN消除运动模糊效果惊人
  8. C++常用数学运算(待完结)
  9. java转发和重定向
  10. 【绝对干货】2021年哔哩哔哩Java高级面试题及答案,完整版开放下载