对CORS OPTIONS预检请求的一些思考

前后端分离模大势所趋,跨域问题更是老生常谈。

《程序员应对浏览器同源策略的姿势》一文提到三种跨域请求方案,重点讲述了w3c和浏览器厂商推出的CORS规范。

同源策略  所谓同源是指域名、协议、端口相同。不同源的浏览器脚本(javascript、ActionScript、canvas)在没有明确授权的情况下,不能读写对方的资源, 这是浏览器最基本的安全规范。

CORS是w3c和浏览器厂商为解决跨域资源共享问题而推出的标准方案:

浏览机器一旦发现跨域请求,就会自动添加一些附加的头信息,有时还会多出一次附加的请求(浏览器自动完成,用户不会察觉),服务器响应特定标头Access-Control-,体现对跨源访问的授权态度。


今天我主要想要聊一聊CORS中的预检请求

当前端使用脚本请求一个跨域资源时,如果是非简单请求(下文会解释),浏览器会自动帮你先发出一个OPTIONS查询请求,称为预检(cors-preflight-request),作用是询问服务器当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段;只有得到肯定答复,浏览器才会发出正式的跨域请求。

"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。

该请求header中会包含以下两个字段:

  • Access-Control-Request-Method: 该字段的值对应当前请求类型,例如 GET、POST、PUT等等。浏览器会自动处理。

  • Access-Control-Request-Headers: 该字段的值对应当前请求可能会携带的额外的自定义header字段名,多个字段用逗号分割。浏览器会自动处理,将请求中非简单的header字段全部列出来,例如标识请求流水的x-request-id,用于Auth鉴权的Authorization 字段。

对于OPTIONS请求,按照规范实现的服务端会响应一组HTTP header,但不会返回任何实体内容。如果服务端支持该跨域请求,建议返回204状态码(返回200也可以);如果不支持,建议返回403状态码(返回404或其他错误状态码也可以)。

响应的header可以包含以下字段:

  • Access-Control-Allow-Origin: 允许哪些域被允许跨域,例如 http://qq.com 或 https://qq.com,或者设置为* ,即允许所有域访问

  • Access-Control-Allow-Credentials: 是否携带票据访问(对应fetch方法中credentials),当该值为true时,Access-Control-Allow-Origin 不允许设置为*

  • Access-Control-Allow-Methods: 标识该资源支持哪些方法,例如:POST, GET, PUT, DELETE

  • Access-Control-Allow-Headers: 标识允许哪些额外的自定义 header 字段和非简单值的字段

  • Access-Control-Max-Age: 表示可以缓存Access-Control-Allow-Methods和Access-Control-Allow-Headers提供的信息多长时间,单位秒,由服务端和浏览器默认值共同决定。

  • Access-Control-Expose-Headers: 通过该字段指出哪些额外的 header 可以被支持。

由此可见,当触发预检时,一次AJAX请求会消耗掉两个TTL,严重影响性能。

那么如何节省掉OPTIONS请求来提升性能呢?从上文可以看出,有两个方案:

  1. 发出简单请求

只要同时满足以下两个条件,就属于简单请求
(1)使用下列方法之一:

  • head

  • get

  • post

(2)请求的Heder是

  • Accept

  • Accept-Language

  • Content-Language

  • Content-Type: 只限于三个值:application/x-www-form-urlencoded、multipart/form-data、text/plain

不同时满足上面的两个条件,就属于非简单请求。很明显,我们常见的Post请求且Content-Type=application/json也属于非简单请求,也会触发预检请求。

>   如果不方便改造为简单请求,只有使用方案2了。

  1. 服务器端设置Access-Control-Max-Age字段

当第一次请求该URL时会发出OPTIONS请求,浏览器会根据返回的Access-Control-Max-Age字段缓存该OPTIONS预检请求的响应结果。在缓存有效期内,该资源的请求(URL和header字段都相同的情况下)不会再触发预检。(chrome 打开控制台可以看到,当服务器响应Access-Control-Max-Age时只有第一次请求会有预检,后面不会了。注意要开启缓存,去掉disable cache勾选)

但是要注意的是,该缓存只针对这一个请求 URL 和相同的 header,无法针对整个域或者模糊匹配 URL 做缓存(当然也可以考虑封装一下,固定一个接口地址,传不同的body内容)。

以上便是对CORS OPTIONS预检请求的一些思考,希望对同学们有所帮助!

最后是Abp vNtext配置CORS的示例:

private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration)
{context.Services.AddCors(options =>{// 无阻塞跨域options.AddPolicy(DefaultCorsPolicyName, builder =>{builder.SetIsOriginAllowed(_ => true).AllowCredentials().AllowAnyHeader().WithMethods(HttpMethods.Get, HttpMethods.Post, HttpMethods.Put, HttpMethods.Delete).SetPreflightMaxAge(TimeSpan.FromHours(24));});});
}

- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age

-  程序员应对浏览器同源策略的姿势

关注并星标我们
更多干货及最佳实践分享

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

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

相关文章

强烈推荐:SiteServer CMS开源免费的企业级CMS系统!

说到CMS,大家都知道织梦、帝国CMS、HPCMS、动易等知名老牌的!这些东西也可以拿来就用,上次看到一个个人开源的cms:MCMS。基于SpringBoot 2架构,前端基于vue、element ui。每月28定期更新版本,为开发者提供…

计算机函数公式中怎么合并合并,Excel用函数和公式瞬间实现把表格全部合并到一个表中去...

将多张工作表汇总到一张工作表,这是什么意思呢?可以理解为把表格全部合并到一个表中去,之前使用VBA代码实现,本文将教会大家一种快速的方法,用函数和公式瞬间实现多表合并。例如:有N多个以月份命名的excel工…

. NET5一出,. NET岗面试普遍喊难,真相是…

.NET高级开发/架构师笔试题TOP101、如何设计一个高并发系统?2、如何实现一个.Net5 IOC框架?3、100W并发4G数据,10W并发400G数据,如何设计Redis存储方式?4、如何实现负载均衡Hash一致性算法?5、DotNetty能够…

数据库年月日时分秒_数据库基本使用系列(二)

书接上回,上回说到数据库的发展历史,存储引擎以及在库层面的一些操作,这次来讲一下数据库中的一些基本的一些数据格式以及对表的一些操作。数据类型数据库提供的数据类型,包括整数类型、浮点数类型、定点数类型、位类型、日期和时…

netcore读取json文件_【NET Core】.NET Core中读取json配置文件

在.NET Framework框架下应用配置内容一般都是写在Web.config或者App.config文件中,读取这两个配置文件只需要引用System.Configuration程序集,分别用System.Configuration.ConfigurationManager.AppSettings["SystemName"];//读取appSettings配…

前端数据层落地实践

源宝导读:天际移动平台经过重构改版,近期正式发布了1.0版本,我们在低代码开发方面做了进一步增强。本文主要围绕前端Model、前端业务逻辑(领域模型)、数据层与视图层解耦(包装器模式)3个方面,给大家分享一下统一数据层方案的设计思…

计算机内存条只认了一个,怎么解决Win10插入2个4G内存条却只显示4G?

为了提高 Win10系统 的运行速度,有用户在自己的电脑中,插入了2根4G内存,可是发现电脑只能显示4G而不是8G,奇怪的是使用卤蛋师却可以检测到8G内存,这是怎么回事呢?我们该如何解决呢?下面&#xf…

scanf 返回值_scanf函数

一、函数scanf()是C语言中的一个输入函数。与printf函数一样&#xff0c;都被声明在头文件stdio.h里&#xff0c;因此在使用scanf函数时要加上#include <stdio.h>。它是格式输入函数&#xff0c;即按用户指定的格式从键盘上把数据输入到指定的变量之中。函数的原型为&…

【Git】Git-常用命令备忘录(三)

git作为一个vcs&#xff08;version control system&#xff09;&#xff0c;是越用越香&#xff0c;那么还有哪些比较香的地方呢&#xff01;&#xff1f;1.远程仓库中拉取指定分支一定遇到这种情况&#xff0c;github看到一个心仪的开源仓库&#xff0c;但是分支太多&#xf…

mysql表类型_MySQL表类型的选择

P131)创建表时的默认引擎是InnoDB&#xff0c;如果要修改默认的存储引擎&#xff0c;可以在参数文件中设置default-table-type。查看当前的默认存储引擎&#xff0c;可以使用一下命令&#xff1a;创建新表的时候可以通过增加ENGINE关键字设置新建表的存储引擎。也可以通过ALTER…

ASP.NET Core Controller与IOC的羁绊

前言看到标题可能大家会有所疑问Controller和IOC能有啥羁绊&#xff0c;但是我还是拒绝当一个标题党的。相信有很大一部分人已经知道了这么一个结论&#xff0c;默认情况下ASP.NET Core的Controller并不会托管到IOC容器中&#xff0c;注意关键字我说的是"默认"&#…

引入Jaeger——扩展

Jaeger是收集全链路跟踪的信息&#xff0c;在Jaeger收集的信息中&#xff0c;有请求的url信息&#xff0c;有每个请求的时间间隔&#xff0c;借助这些信息可以进行报警&#xff0c;比如一次较长的请求&#xff0c;或者是某些请求的次数和先后等。不管报警的业务规则是什么&…

判断 服务器架构性能 数据,服务器架构之性能扩展-第五章(6)

Mysql>create table t2 like t1;//复制表结构Mysql>insert into t2 select * from t1; //复制数据内容索引是一种快速查询的有效方法&#xff0c;可以通过alter增加索引或create语句创建。mysql>alter table t1 add ind_id (id);mysql>alter table t1 add unique/p…

如何在 ASP.NET Core 中 使用 功能开关

.NET Core 中的 功能管理 (Feature Management) 包可用于实现 功能开关&#xff0c;什么意思呢&#xff1f;就是可以通过 功能开关 特性动态的改变应用程序的行为而不需要改变任何的业务逻辑代码&#xff0c;听起来是不是挺有意思&#xff0c;本篇我们就来讨论如何使用这个包。…

「译」 .NET 5 新增的Http, Sockets, DNS 和 TLS 遥测

.NET 一直在稳定的增加和改善对应用程序进行跨平台的诊断分析&#xff0c;在.NET Core 3.0&#xff0c; 我们看到了 EventCounters[1] 的介绍&#xff0c;用于观察和分析指标测量。我最近在几个 .NET Core 的应用程序中使用 counters&#xff0c;来跟踪服务一段时间内 http 的请…

服务器磁盘系统,服务器磁盘阵列与操作系统

服务器磁盘阵列与操作系统 内容精选换一换硬件要求如表1所示。操作系统要求如表2所示。上表中所需Ubuntu下载地址&#xff1a;服务器1&#xff1a;Ubuntu 18.04.1镜像包、Ubuntu 16.04.4 镜像包。服务器2&#xff1a;Ubuntu 16.04.3 镜像包。在安装操作系统过程中“选择软件列表…

Prism for WPF 搭建一个简单的模块化开发框架

站长今天发现一个好项目&#xff0c;看原文贴图挺不错的&#xff0c;好项目应该让更多人知道&#xff0c;特别是该项目使得Prism搭建&#xff0c;网上使用prism做的开源成熟项目不多&#xff0c;这个值得大家研究。看项目gitee仓库截图&#xff0c;项目不错&#xff0c;star太少…

探索 .Net Core 的 SourceLink

介绍Source Link是一组软件包和一个规范&#xff0c; 它将一些元数据添加到PDB文件&#xff0c;以将本地文件重新映射到GitHub上的文件&#xff0c;因此Visual Studio可以在这需要时下载文件, 该项目的目的是可以为使用Nuget安装软件的用户提供源代码调试, Microsoft库&#xf…

「译」 用 Blazor WebAssembly 实现微前端

原文作者: Wael Kdouh原文链接&#xff1a;https://medium.com/waelkdouh/microfrontends-with-blazor-webassembly-b25e4ba3f325我聊下最近我在做的事情&#xff0c;然后分享下在Blazor WebAssembly 微前端的实现细节&#xff0c;这篇文章是我的一些心得&#xff0c;以及一个示…

使用 dotnet-monitor 分析.NET 应用程序

dotnet-monitor 是 .NET Core 命令行接口 (CLI) 工具, 可以很方便的在dotnet环境中分析我们的应用程序&#xff0c;需要注意的是&#xff0c;目前它还只是一个实验性的工具在这之前&#xff0c;我们使用的有 dotnet-counters&#xff0c;dotnet-dump 和 dotnet-trace&#xff0…