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,一经查实,立即删除!

相关文章

安装vs2019导致vs2017打开项目失败

工作要求参与某项目&#xff0c;但是需要安装vs2019&#xff0c;于是乎下载安装&#xff0c;开项目干活&#xff0c;等工作完成后&#xff0c;继续维护之前的项目&#xff0c;这时发现项目打开失败&#xff0c;不能加载&#xff0c;因为这个项目一直用的vs2017&#xff0c;之前…

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

全文共计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…

c++中vector使用的小问题

接手项目原有代码&#xff0c;在昨天接到bug提示&#xff0c;一条数据处理时程序崩溃&#xff0c;于是有了这个查找问题的小总结。 gdb调试时问题定位到&#xff1a;malloc(): smallbin double linked list corrupted&#xff0c;然后看了那块儿的代码&#xff0c;并没有发现有…

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

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

Java中bytebuffer和string的转换记录

原文地址&#xff1a;https://stackoverflow.com/questions/17354891/java-bytebuffer-to-string byte[] bytes k.getBytes( StandardCharsets.UTF_8 ); String v new String( bytes, StandardCharsets.UTF_8 ); String s StandardCharsets.UTF_8.decode(byteBuffer).toStr…

python 调用c++库接口出错

首先&#xff0c;python使用c库传数据的部分方法在我之前的小心得里有&#xff1a;python调用c的库传递二级指针&#xff0c;希望有帮到大家。 今天说一下c的接口里使用智能指针shared_ptr接收数据的问题&#xff0c;接口都是使用的指针传递数据&#xff0c;原本的想法很简单&a…

批量执行命令(SSH)

for a in {1..6} ; do scp /etc/hosts enc-bigdata0$a:/etc/hosts ; done转载于:https://www.cnblogs.com/net2817/p/8057409.html

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

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

搭建opencv环境

有个测试项目&#xff0c;需要opencv环境&#xff0c;于是搭建一个&#xff0c;但是这个项目又需要python3.6以上&#xff0c;ubuntu服务器上是3.5&#xff0c;需要升级&#xff0c;这个比较简单&#xff0c;我直接升级到了3.7&#xff1a; sudo apt-get install python3.7然后…

用源生的JavaScript编写一个异步的ajax库

用源生的JavaScript写一个ajax的库&#xff0c;这样就不用每次都调用jQuery库了&#xff0c;依据ajax请求的步骤写&#xff0c;ajax请求有四个步骤:1.创建一个ajax对象&#xff0c;2.跟服务器进行连接&#xff1b;3.发送请求&#xff1b;4.接收返回值。 直接创建一个ajax的函数…

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

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

Error:collect2:ld returned 1 exit status的其他原因

首先感谢&#xff1a;https://blog.csdn.net/li809735472/article/details/85231950&#xff0c;这里有多个总结&#xff0c;虽然没解决我的问题&#xff0c;但是可能帮到别人&#xff0c;所以引用到这里。 我自己使用vs的Linux插件&#xff0c;直接在Linux服务器编译程序&…

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

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

psycopg2.errors.UndefinedTable: relation “xxxx“ does not exist

psycopg2.errors.UndefinedTable: relation “xxxx” does not exist python连接PostgreSQL之后&#xff0c;查找操作报错如题&#xff0c;原因是数据库表名是有大写字母&#xff0c;需要在表名上加入双引号&#xff0c;因为PostgreSQL大小写不敏感。比如&#xff1a;‘select …

机器学习专业名词中英文对照

activation 激活值 activation function 激活函数 additive noise 加性噪声 autoencoder 自编码器 Autoencoders 自编码算法 average firing rate 平均激活率 average sum-of-squares error 均方差 backpropagation 后向传播 basis 基 basis feature vectors 特征基向量 batch …

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

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

类似collect2: ld returned 1 exit status的错误

今天帮忙处理一个链接问题&#xff0c;使用vs2015编译&#xff0c;链接时报错&#xff1a;collect2: ld returned 1 exit status以及not found (try using -rpath or -rpath-link)。 首先想到的是在linker部分添加第三方库目录&#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 医疗健康越…