http跨域网络请求中的CORS(跨源资源共享) 那些事 -- HTTP跨域请求, chrome插件跨域请求使用详解, origin格式,origin通配符等

news2024/11/13 16:35:49

在我们进行网络应用开发的时候,如果用到了跨域网络请求,则不可避免的就会遇到http跨域网络请求 CORS的问题,今天就和大家来聊聊跨域网络请求中的CORS的那些事。

跨源资源共享(CORS)

CORS 是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其他源协议、域名或端口),使得浏览器允许这些源访问加载自己的资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的“预检”请求。在预检中,浏览器发送的头中标示有 HTTP 方法和真实请求中会用到的头。

跨源 HTTP 请求的一个例子:运行在 https://domain-a.com 的 JavaScript 代码使用 XMLHttpRequest 来发起一个到 https://domain-b.com/data.json 的请求。

出于安全性,浏览器限制脚本内发起的跨源 HTTP 请求。例如,XMLHttpRequest 和 Fetch API 遵循同源策略。这意味着使用这些 API 的 Web 应用程序只能从加载应用程序的同一个域请求 HTTP 资源,除非响应报文包含了正确 CORS 响应头。
 

CORS 机制的图表表示

CORS 机制允许 Web 应用服务器进行跨源访问控制,从而使跨源数据传输得以安全进行。现代浏览器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch)使用 CORS,以降低跨源 HTTP 请求所带来的风险

CORS使用

在了解了什么是CORS后我们就来聊聊怎么使用了, CORS是通过在服务端的相应头Header中通过 Access-Control-Allow-Origin 头来标识的, 格式如下:

Access-Control-Allow-Origin: <origin> | *

 注意这里的允许的Origin的格式, 可是是具体的origin 或者通配符 * 表示允许所有请求

origin格式: 协议://域名[端口]   

这里的协议可以是  http,  https,  chrome-extension (chrome扩展里面进行的网络请求时的origin协议)

[端口]    如果是默认的 80  443 端口可以省略, 非默认端口就必须要指定允许的具体端口

origin示例

仅允许协议为https的域名dev.tekin.cn发送跨域请求: https://dev.tekin.cn 

允许tekin.cn域名下的所有跨域请求:*.tekin.cn

chrome插件跨域请求CORS

允许chrome插件ID为 iflfjlikpkacloanbaaokocoafabjndg 的chrome插件发送跨域请求origin为: chrome-extension://iflfjlikpkacloanbaaokocoafabjndg

如何查看你的chrome插件ID? 

在chrome的 扩展程序 菜单里面即可查看,如下:

附带身份凭证的请求 Access-Control-Allow-Credentials 与CORS通配符 * ?

        Access-Control-Allow-Credentials 头指定了当浏览器的 credentials 设置为 true 时是否允许浏览器读取 response 的内容。当用在对 preflight 预检测请求的响应中时,它指定了实际的请求是否可以使用 credentials。请注意:简单 GET 请求不会被预检;如果对此类请求的响应中不包含该字段,这个响应将被忽略掉,并且浏览器也不会将相应内容返回给网页。

如果我们在响应header中开启了 Access-Control-Allow-Credentials : true 则必须遵守以下规则:

  • 服务器不能将 Access-Control-Allow-Origin 的值设为通配符“*”,而应将其设置为特定的域,如:Access-Control-Allow-Origin: https://example.com
  • 服务器不能将 Access-Control-Allow-Headers 的值设为通配符“*”,而应将其设置为标头名称的列表,如:Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
  • 服务器不能将 Access-Control-Allow-Methods 的值设为通配符“*”,而应将其设置为特定请求方法名称的列表,如:Access-Control-Allow-Methods: POST, GET

对于附带身份凭证的请求(通常是 Cookie),

这是因为请求的标头中携带了 Cookie 信息,如果 Access-Control-Allow-Origin 的值为“*”,请求将会失败。而将 Access-Control-Allow-Origin 的值设置为 https://example.com,则请求将成功执行。


Access-Control-Allow-Methods

Access-Control-Allow-Methods 标头字段指定了访问资源时允许使用的请求方法,用于预检请求的响应。其指明了实际请求所允许使用的 HTTP 方法。

Access-Control-Allow-Methods: <method>[, <method>]*

有关预检请求的示例已在上方给出,包含了将此请求头发送至浏览器的示例。

Access-Control-Allow-Headers

Access-Control-Allow-Headers 标头字段用于预检请求的响应。其指明了实际请求中允许携带的标头字段。这个标头是服务器端对浏览器端 Access-Control-Request-Headers 标头的响应。
Access-Control-Allow-Headers: <header-name>[, <header-name>]*
 

Access-Control-Expose-Headers

在跨源访问时,XMLHttpRequest 对象的 getResponseHeader() 方法只能拿到一些最基本的响应头,Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma,如果要访问其他头,则需要服务器设置本响应头。
Access-Control-Expose-Headers 头将指定标头放入允许列表中,供浏览器的 JavaScript 代码(如 getResponseHeader())获取。

Access-Control-Expose-Headers: <header-name>[, <header-name>]*

例如:
Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header

这样浏览器就能够通过 getResponseHeader 访问 X-My-Custom-Header 和 X-Another-Custom-Header 响应头了。


CORS go语言中使用示例 

yml配置信息

 以下是gin框架中的CORS中间件的使用示例代码, 其他的语言或者框架也都是一样的,就是将相关的响应Header头设置上即可。

总结:

1. 在服务端设置Access-Control-Allow-Origin时需要注意是否同时设置了Access-Control-Allow-Credentials : true ,如果是 则origin就不能使用*通配符,则必须指定对应的 origin; 

2. origin的格式必须包含请求协议和域名,如 https://dev.tekin.cn

3. 在chrome插件里面的协议是 chrome-extension:// 域名对应的是chrome的插件ID

4. origin中的端口如果是默认的80, 443端口,则可以省略, 如果是非默认端口,则必须包含完整的协议域名和端口信息。

 

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

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

相关文章

ISO26262-MBD-静态验证在V左的布局考量

一、ISO26262-MBD-静态验证的迷惑 模型的开发方法&#xff08;Model-Based Design&#xff0c;MBD&#xff09;在汽车行业嵌入式软件开发中扮演着重要的角色&#xff0c;功能安全ISO26262要求对我们搭建的模型进行规范检查。合规检查我们可以借助第三方工具来实现静态检查&…

基于Django的图书管理系统【万能模板框架可调整增加】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主框架介绍项目框架每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 框架介绍 Django是一个用于快速开发Web应用程序的高级Python开源框架。它遵循MVC…

去除富文本框的边框

<style lang"scss" scoped>::v-deep .textareaDeep .el-textarea__inner {border: none !important;box-shadow: none !important;padding: 0px; }</style> //添加类名 <el-inputclass"textareaDeep"type"textarea":rows"…

Go语言实现依赖注入

文章目录 前言依赖注入是什么依赖注入的好处是什么结构图应用程序上下文接口上下文管理器暴露的功能使用示例最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;欢迎来到我的博客&#xff0c;今天带领大伙使用Go语言实现依赖自动注入&#xff0c;我们不会使用其它的第三方库…

域控安全:多种方式提取ntds.dit

ntdsutils.exe提取ntds.dit vssadmin提取ntds.dit vssown提取ntds.dit IFM ntds.dit: ntds.dit为AD的数据库&#xff0c;内容有域用户、域组、用户hash等信息&#xff0c;域控上的ntds.dit只有可以登录到域控的用户&#xff08;如域管用户、DC本地管理员用户&#xff09;可以…

HexView 刷写文件脚本处理工具-基本功能介绍(一)-基本界面

HexView主要可以显示不同文件格式的内容&#xff0c;包括Intel-HEX、Motorola S-record二进制文件或其他特定汽车制造商的文件格式。此外&#xff0c;它还可以执行多种数据处理操作&#xff0c;如校验和计算、签名生成、数据加密/解密或压缩/解压缩&#xff0c;甚至重新排列文件…

ubuntu创建txt

点击模版 右键 输入下面代码 sudo gedit txt文档.txt 然后就可以右键新建文本文件了 解开权限 sudo chmod -R 777 /home/sjxy/CQ

探索下一代互联网协议:IPv6的前景与优势

探索下一代互联网协议&#xff1a;IPv6的前景与优势 文章目录 探索下一代互联网协议&#xff1a;IPv6的前景与优势**IPv6 的特点****IPv6的基本首部****IPv6的地址****总结** 互联网的核心协议&#xff1a;从IPv4到IPv6 互联网的核心协议IP&#xff08;Internet Protocol&#…

【Nacos无压力源码领读】(一) Nacos 服务注册与订阅原理

本文将详细介绍 Nacos 客户端在启动时进行自动注册原理, 以及Nacos服务器是如何处理客户端的注册与订阅请求的; 本文会附带源码解读, 但不会死抠每一行代码, 主要是梳理整个流程, 过程中的关键步骤, 都会由思维导图的形式展现出来; 如果在阅读过程中对文中提到的 SpringBoot …

Comsol 弧形声学换能器声聚焦仿真

弧形声学换能器声聚焦是指将声波能量集中在弧形声学换能器的特定区域内&#xff0c;以实现更强的声场强度和分辨率。声聚焦在许多应用中非常有用&#xff0c;包括医学超声成像、声纳、声波聚焦破碎等领域。 弧形声学换能器的设计和优化可以通过以下几个因素来实现声聚焦&#…

【网站项目】SpringBoot743中珠商城仓库管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

A股破新低后震荡盘整,后市如何演绎?

今天的A股&#xff0c;让人按耐不住了&#xff0c;你们知道是为什么吗&#xff1f;盘面上出现1个重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市冲高回落&#xff0c;主力压盘、故意洗筹码的意图就更加明显了&#xff0c;一定要拿住&#xff01;地板上卖出的&#xf…

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-4-启动浏览器-基于Maven(详细教程)

1.简介 上一篇文章&#xff0c;宏哥已经在搭建的java项目环境中添加jar包实践了如何启动浏览器&#xff0c;今天就在基于maven项目的环境中给小伙伴们或者童鞋们演示一下如何启动浏览器。 2.eclipse中新建maven项目 1.依次点击eclipse的file - new - other &#xff0c;如下…

初阶数据结构5 排序

排序 1. 排序概念及运用1.1 概念1.2运用1.3 常见排序算法 2. 实现常⻅排序算法2.1 插⼊排序2.1.1 直接插⼊排序2.1.2 希尔排序2.1.2.1 希尔排序的时间复杂度计算 2.2 选择排序2.2.1 直接选择排序2.2.2 堆排序 2.3 交换排序2.3.1冒泡排序2.3.2 快速排序2.3.2.1 hoare版本2.3.2.2…

学习c#-4语句 ,条件,循环

代码&#xff1a; string name "小赵"; //条件判断 if (name "小赵") { Console.WriteLine("我是小赵"); } else { Console.WriteLine("我不是小赵"); } // switch条件判断 switch (name) { case "小…

【letcode-c++】283.移动零

一、题目 二、分析 题目让我们不能复制&#xff0c;只能在数组中交换移动。那么数组中的移动&#xff0c;比较方便的是前后两个元素交换&#xff0c;并且非零元素相对位置不变&#xff0c;那就考虑0和它后面的非0元素进行交换&#xff0c;进一步思考&#xff0c;除了单个0移动…

双指针习题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

1.3 C 语言入门实战:从 Hello World 到基础语法解析

目录 1 程序的作用 2 初识 Hello World 2.1 新建项目 2.2 程序解释 3 printf 基本使用 4 单行与多行注释 4.1 单行注释 4.2 多行注释 4.3 嵌套错误 5 项目在磁盘上的位置 1 程序的作用 如下图所示&#xff0c;我们编写了一个可以做加法的程序&#xff0c;我们给程序…

聚鼎科技:装饰画做起来真的难吗

在艺术的殿堂中&#xff0c;装饰画以其独特的魅力占据一席之地。不少人对制作装饰画心生向往&#xff0c;却犹豫于其实操难度。今天&#xff0c;让我们一同揭开装饰画制作的神秘面纱&#xff0c;探讨其背后的秘密。 装饰画的创作并非高不可攀&#xff0c;它更像是一场与色彩和形…

OpenAI API推出结构化输出功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…