fetch为什么加了允许跨域请求mode: ‘no-cors‘,添加的多个header就丢失了?

news/2025/3/9 5:54:58/

当你在 fetch 请求中设置 mode: 'no - cors' 时,添加的多个自定义请求头会丢失,这主要是由 CORS(跨域资源共享)机制和 no - cors 模式的特性决定的。下面为你详细解释:

1. CORS 机制概述

CORS 是一种现代浏览器的安全机制,用于控制跨域请求。当浏览器发起跨域请求时,会根据请求的类型(简单请求或预检请求)和服务器端的配置来决定是否允许该请求。简单请求通常可以直接发送,而预检请求(复杂请求)会先发送一个 OPTIONS 请求到服务器,以确认服务器是否允许该请求。

2. no - cors 模式的特性

no - cors 模式是 fetch API 提供的一种特殊模式,其设计目的是允许浏览器发起一些简单的跨域请求,而无需进行复杂的 CORS 预检请求。不过,这种模式也有一些严格的限制:

  • 请求方法限制:只允许使用 GETHEAD 或 POST 方法。
  • 请求头限制:只允许使用所谓的 “简单请求头”。简单请求头包括:
    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type(但值只能是 application/x-www-form-urlencodedmultipart/form-data 或 text/plain

3. 自定义请求头丢失的原因

当你设置 mode: 'no - cors' 时,浏览器会严格遵循上述规则。如果你添加了除简单请求头之外的自定义请求头(如 AuthorizationCustom - Header 等),浏览器会忽略这些自定义请求头,以确保请求符合 no - cors 模式的要求。这是为了避免违反 CORS 机制,防止在不进行预检请求的情况下发送可能不安全的跨域请求。

示例代码说明

收起javascript

fetch('https://example.com', {mode: 'no-cors',headers: {'Content-Type': 'application/json','Authorization': 'Bearer your_token_here','Custom-Header': 'Custom Value'}
}).then(response => {console.log(response);}).catch(error => {console.error(error);});

在这个例子中,Authorization 和 Custom - Header 这些自定义请求头会被浏览器忽略,因为它们不属于简单请求头,而 Content - Type: application/json 也不符合 no - cors 模式下 Content - Type 的允许值范围,所以实际上浏览器只会发送符合简单请求头规则的请求头。

解决方案

  • 如果需要自定义请求头:不要使用 no - cors 模式。可以尝试使用 cors 模式(默认值),并确保服务器端正确配置了 CORS 头,以允许跨域请求和自定义请求头。
  • 如果不需要读取响应内容:可以继续使用 no - cors 模式,但要避免添加自定义请求头,只使用简单请求头。

http://www.ppmy.cn/news/1577303.html

相关文章

Python第十四课:数据可视化 | 信息炼金术

🎯 本节目标 掌握Matplotlib基础图表绘制理解Seaborn高级统计可视化学会使用Pyecharts制作交互式图表开发实战项目:疫情数据动态仪表盘掌握可视化设计原则与优化技巧 1️⃣ 可视化工具全景图 📊 生活化比喻: Matplotlib → 手工雕刻刀&…

子数组问题——动态规划

个人主页:敲上瘾-CSDN博客 动态规划 基础dp:基础dp——动态规划-CSDN博客多状态dp:多状态dp——动态规划-CSDN博客 目录 一、解题技巧 二、最大子数组和 三、乘积最大子数组 四、最长湍流子数组 五、单词拆分 一、解题技巧 区分子数组&…

机试准备第10天

首先学习二分搜索法。使用二分查找需要先排序。第一题是查找&#xff0c;现学现卖。 //二分查找 #include <stdio.h> #include <vector> #include <algorithm> using namespace std; int main(){int n;scanf("%d", &n);vector<int> a(n…

②EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器

EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 网关 MS-A2-1021 产品功能 MS-A2-1021 网关通过 EtherCAT 协议与自由协议或 Modbus 协议的相互转换&#xff0c;可以将RS485 串口设备接入 EtherCA…

(二 十)趣学设计模式 之 迭代器模式!

目录 一、 啥是迭代器模式&#xff1f;二、 为什么要用迭代器模式&#xff1f;三、 迭代器模式的实现方式四、 迭代器模式的优缺点五、 迭代器模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;…

鸿蒙启动页开发

鸿蒙启动页开发 1.1 更改应用名称和图标 1.更改应用图标 找到moudle.json5文件&#xff0c;找到应用启动的EntryAbility下面的icon,将原来的图标改成自己设置的即可 2.更改应用名称 3.效果展示 2.1 广告页面开发 3.1 详细介绍 3.1.1 启动页面 import { PrivacyDialog } fr…

视觉在协作机器人上的场景应用

看了UR、ABB等协作机器人公司的一些视觉方面的应用&#xff0c;总结大概有下面几个方面。 1.工业制造领域 3C 产品生产 外观检测&#xff1a;可精确检测电子元件的划痕、污渍、凹陷等外观缺陷&#xff0c;如手机屏幕的微小划痕、芯片表面的瑕疵等&#xff0c;确保产品高质量&a…

(YOLOv11)基于Vue Flask YOLOv11的水稻病害检测系统【含有数据大屏展示】

基于Vue Flask YOLOv11的水稻病害检测系统 基于Vue Flask YOLOv11的水稻病害检测系统前言技术选择文件结构项目截图 基于Vue Flask YOLOv11的水稻病害检测系统 前言 该项目是学校的一个课程项目&#xff0c;内容原创&#xff0c;故暂时不开源&#xff0c;需要源码请联系作者。…