CORS预检请求详谈

引言

最近在项目中因前后端部署不同地方,前端在请求后端api时发生了跨域请求,我们采用CORS(跨域资源共享)来解决跨域请求,这需要前后端的配合来完成。在这一过程中,后端支持了CORS跨域请求后,前端的请求配置可能会调起CORS的preflight请求,也就是我们所说的预检请求。对CORS不太熟悉的可能会很容易忽视掉这个问题。下面就来说说CORS的preflight请求。CORS的基本用法不在本文讨论中,可以参考阮老师的跨站资源共享CORS详解。

CORS prefligt请求

preflight请求,就是在发生cors请求时,浏览器检测到跨域请求,会自动发出一个OPTIONS请求来检测本次请求是否被服务器接受。一个OPTIONS请求一般会携带下面两个与CORS相关的头:

  • Access-Control-Request-Method : 本次预检请求的请求方法。
  • Access-Control-Request-Headers:本次请求所携带的自定义首部字段。这些字段是导致产生OPTIONS请求的一个原因。后面会讲到。

这样,服务端收到该预检请求后,会返回与CORS相关的响应头。主要会包括下面几个,但可能还会有其他的有关CORS字段:

  • Access-Control-Allow-Origin: 服务器允许的跨域请求源
  • Access-Control-Allow-Methods: 服务器允许的请求方法
  • Access-Control-Allow-Headers : 服务器允许的自定义的请求首部字段

服务器通过CORS跨域请求后,下面浏览器就会发生正式的数据请求。整个请求过程其实是发生了两次请求:一个预检请求,通过后的实际数据请求。这些都可以在浏览器网络请求中看到。可以参考下图:
408483-20171217172031968-1449680579.png

需要注意的是:

1、在上面的两次请求中,预检请求只是一个检查的过程,它不会携带任何请求的参数;预检通过后的请求才会真正的携带请求参数与服务器进行数据通信。

2、若服务器对预检请求没有任何响应,那么浏览器不知道服务器是否支持CORS而不会发送后续的实际请求;或者服务器不支持当前的Origin跨域访问也不会发送后续请求。

发生preflight请求的条件

上面的预检请求并不是CORS请求的必须的请求过程,在一定的条件下并不需要发生预检请求。那么发生预检请求的条件是什么呢?根据HTTP访问控制(CORS)介绍,其实发生预检请求的条件:是否是简单请求。简单请求则直接发送具体的请求而不会产生预检请求。具体来说如下:

满足下面的所有条件就不会产生预检请求,也就是该请求是简单请求:

  • 请求方法是GETPOSTHEAD其中任意一个

  • 必须是下面定义对CORS安全的首部字段集合,不能是集合之外的其他首部字段。
    Accept、Accept-Language、Content-Language、Content-Type、DPR、Downlink、Save-Data、Viewport-Width、Width。

  • Content-Type的值必须是text/plainmultipart/form-dataapplication/x-www-form-urlencoded中任意一个值

满足上面所有的条件才不会发送预检请求,在实际项目中我们的请求格式可能是application/json格式编码,或者使用自定义请求头都会触发CORS的预检请求。

所以,在项目中是否会触发CORS的预检请求要做到心中有数。

一个发送的预检请求的列子

我们拿一个实际发生预检请求的例子来说明整个过程。考虑下面的一个例子:

var xhr = new XMLHttpRequest();
var url = 'http://bar.other/resources/post-here/';
var body = '<?xml version="1.0"?><person><name>Arun</name></person>';function callCors(){if(xhr){xhr.open('POST', url, true);xhr.setRequestHeader('X-PINGOTHER', 'pingpong');xhr.setRequestHeader('Content-Type', 'application/xml');xhr.onreadystatechange = handler;xhr.send(body); }
}
......

上面请求中在请求中添加了自定义首部字段X-PINGOTHER,并且请求的Content-Type值application/xml。因此该请求首先会触发一个预检请求。具体的过程见下图
408483-20171217175658811-316990328.png

通过上图可以看到请求实际产生了2次与服务交互的过程,最后一次会将请求参数传给服务器。这样一个CORS请求过程就完成了。

需要注意的一个有关CORS的点:

对于附带身份凭证的请求(即服务器设置Access-Control-Allow-Credentials: true),服务器不得设置 Access-Control-Allow-Origin 的值为“*”。否则请求将会失败。

个人理解是Cookie还是遵循同源策略的,即使因为这个请求是跨域请求,所以每个Origin的Cookie是不能被其他Origin获取到的,也就是不允许Access-Control-Allow-Origin 的值为“*”。

参考文献

1、跨域资源共享 CORS 详解
2、HTTP访问控制(CORS)
3、CORS - How do 'preflight' an httprequest?

转载于:https://www.cnblogs.com/wonyun/p/CORS_preflight.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

制胜人工智能时代——企业人工智能应用现状分析(第三版)

全文共计300字25图&#xff0c;预计阅读时间9分钟来源 | 德勤Deloitte&#xff08;转载请注明来源&#xff09;编辑 | 张77当前&#xff0c;现今一代人工智能技术的应用正在展开新的篇章。我们可以看到&#xff0c;人工智能已被广泛部署于各类用例&#xff0c;以解决不同业务问…

Tomcat启动时项目重复加载,导致资源初始化两次的问题

最近在项目开发测试的时候&#xff0c;发现Tomcat启动时项目重复加载&#xff0c;导致资源初始化两次的问题导致该问题的原因&#xff1a;如下图&#xff1a;在Eclipse中将Server Locations设置为“Use Tomcat installation(takes control of Tomcat installation)”时&#xf…

论文速递:通过模拟大脑-解决深度学习中的灾难性遗忘

来源&#xff1a;混沌巡洋舰灾难性遗忘指的是&#xff1a;不像人类&#xff0c;当深度学习模型被训练完成新的任务时&#xff0c;他们很快就会忘记以前学过的东西。8月13号的自然通讯论文Brain-inspired replay for continual learning with artificial neural networks&#x…

蒲慕明院士PNAS最新研究:神经元数量在共同激活诱导大脑神经元兴奋性增强的重要性...

来源&#xff1a;brainnews2020年8月3日&#xff0c;中国科学院脑科学与智能技术卓越创新中心(神经科学研究所)、上海脑科学与类脑研究中心、神经科学国家重点实验室蒲慕明研究组在《Proceedings of the National Academy of Sciences》杂志在线发表了题为《同步激活大量神经元…

一文读懂什么是数字孪生?

文章转载自微信公众号数字孪生大赛&#xff0c;版权归原作者及刊载媒体所有。一、数字孪生的概念从理论的概念来看&#xff0c;Digital Twin数字孪生:是充分利用物理模型、传感器更新、运行历史等数据&#xff0c;集成多学科、多物理量、多尺度、多概率的仿真过程&#xff0c;在…

第五轮学科评估再提“破五唯”

来源&#xff1a;中国科学报作者&#xff1a;袁一雪近日&#xff0c;教育部官网公布了对《关于完善高校学科评估制度&#xff0c;促进教育治理体系和能力现代化的提案》的答复&#xff0c;提到学科评估坚决破除“五唯”顽疾。评价教师不唯“学历”和“职称”&#xff0c;不设置…

MEMS惯性传感器有哪些趋势?

来源&#xff1a;半导体产业基金整理如何在灾难救援中&#xff0c;精准定位受困人员的位置&#xff1f;如何在无人机操作中&#xff0c;提高系统精度&#xff1f;如何在人机交互中&#xff0c;更好的实现动作检测和姿势识别&#xff1f;如何在自动驾驶中&#xff0c;做到更精确…

css pointer-event

详见&#xff1a;张鑫旭 CSS3 pointer-events:none应用举例及扩展 pointer-events:none &#xff0c;可以使事件穿透&#xff0c; 如&#xff1a; 2 覆盖在 1 上面。 给 2 设置 pointer-events:none&#xff1b;那么点击在 2 上将无效&#xff0c; 可以直接触发 1 上的事件 转载…

5G智慧医疗十大应用场景,你知道多少?

来源&#xff1a;北京物联网智能技术应用协会都说5G会改变千行百业&#xff0c;其中&#xff0c;5G医疗健康就是5G技术在医疗健康行业的一个重要应用领域。随着 5G 正式商用的到来以及与大数据、互联网、人工智能、区块链等前沿技术的充分整合和运用&#xff0c; 5G 医疗健康越…

起源,机制与趋势,如何理解和定义城市大脑

前言&#xff1a;本文从城市大脑的起源背景&#xff0c;技术支撑&#xff0c;建设重点&#xff0c;服务对象和发展目标等多个角度&#xff0c;对城市大脑如何定义进行了分析和解读&#xff0c;提出&#xff1a;城市大脑是互联网大脑架构与智慧城市建设结合的产物&#xff0c;是…

DARPA举办AlphaDogfight决赛,AI 操控战斗机5:0战胜人类飞行员

来源&#xff1a;必达智库由美国国防部高级研究计划局&#xff08;DARPA&#xff09;举办的 “阿尔法狗决战试验”&#xff08;AlphaDogfight&#xff09;决赛当地时间8月20日于正式落下帷幕。最终&#xff0c;赫伦系统公司&#xff08;Heron Systems&#xff09;在虚拟空战中以…

A. PHP文件运行原理

转载于:https://www.cnblogs.com/youyuanjuyou/p/8099665.html

智源研究院首席科学家刘嘉:认知神经的未来发展规划是什么?

来源 | AI前线演讲嘉宾 | 刘嘉编辑 | 冬梅8 月 24 日&#xff0c;北京智源人工智能研究院在京举办了人工智能的认知神经基础发布会。会上&#xff0c;智源研究院发布了重大研究方向——“人工智能的认知神经基础”&#xff0c;以跨学科交叉方式进一步夯实人工智能的科学基础。…

最全数学各个分支简介

来源&#xff1a;算法数学俱乐部编辑 ∑Gemini数论人类从学会计数开始就一直和自然数打交道了&#xff0c;后来由于实践的需要&#xff0c;数的概念进一步扩充&#xff0c;自然数被叫做正整数&#xff0c;而把它们的相反数叫做负整数&#xff0c;介于正整数和负整数中间的中性数…

三大运营商集体为电费发愁,宣布“智能化关闭5G基站”,5G建设能省则省!

来源&#xff1a;卫星与网络何为“智能化关闭5G基站”本月初有消息称&#xff0c;中国联通洛阳分公司分别对已经入网的3种不同基站射频单元设备&#xff08;AAU&#xff09;&#xff0c;分不同时段定时开启空载状态下的深度休眠功能&#xff0c;从而实现智能化基站设备能耗管控…

脑电传感器并不复杂,那精度呢?

来源&#xff1a;网络脑电传感器并不复杂&#xff0c;只是精度很难保证。本质上就是一个金属电极加上一个放大器&#xff08;前置保护&#xff09;&#xff0c;主要是防止传输过程中电压发生改变。一、介绍脑电波&#xff08;EEG&#xff09;检测其实和在医院常见的心电图&…

前端智能化的加速时刻:华为机器视觉的创新方程式

来源&#xff1a;脑极体守林员小陈每天的工作&#xff0c;大部分时间都用来在林间巡逻&#xff0c;以便第一时间发现安全隐患。枯燥繁重的工作让年轻的他有点郁闷。有天他举着朋友圈里转发的文章问领导&#xff0c;听说有地方都能用AI来识别山火了&#xff0c;咱们啥时候能用上…

Vue-Router + Vuex 实现单页面应用

效果查看(一个食品安全网,大家也可以发布一些食品安全的见闻,尽举手之劳): 源代码:https://pan.baidu.com/s/1i43H3LV 如果想要服务器端代码可以在评论里说明一下 利用vue路由和vuex实现了一个单页面应用&#xff0c;项目结构如下: 入口&#xff1a;main.js import ./global.cs…

改变宇宙之前,GPT-3最先改变的可能是OpenAI

大数据文摘出品来源&#xff1a;bdtechtalks编译&#xff1a;HippoGPT-3是人工智能研究实验室OpenAI的最新成果。它是有史以来规模最大的语言模型&#xff0c;引发了一系列关于人工智能将如何快速改变众多行业的讨论。但是&#xff0c;很少有人去讨论GPT-3是如何改变OpenAI本身…

day2-元组 列表-赋值和深浅拷贝

一 元组 元组其实跟列表差不多&#xff0c;也是存一组数&#xff0c;只不是它一旦创建&#xff0c;便不能再修改&#xff0c;所以又叫只读列表 用途&#xff1a;一般情况下用于自己写的程序能存下数据&#xff0c;但是又希望这些数据不会被改变&#xff0c;比如&#xff1a;数据…