【JS|第22期】深入理解跨域

日期:2024年7月6日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006

说在最前面:本文 vue3 的示例代码,在没有另外声名的情况下,均采用 <script setup> 组合式代码风格,风格统一,避免混乱,请各位新老食客放心食用哈 ^ _ ^


文章目录

  • 一、前言
  • 二、同源策略:安全的守护神
    • (1)协议(Protocol)
    • (2)域名(Domain Name)
    • (3)端口号(Port Number)
  • 三、跨域问题的诞生
    • (1)分布式架构的发展
    • (2)前后端分离的开发模式
    • (3)第三方服务集成
    • (4)浏览器安全考虑
  • 四、跨域解决方案:从古老到现代
    • (1)JSONP:古老而简单
    • (2) CORS:现代与安全的典范
    • (3) document.domain:跨子域的捷径
    • (4)window.postMessage:HTML5的安全通信通道
    • (5)服务器代理:后端的桥梁
  • 五、跨域请求的幕后故事
    • (1)发起请求
    • (2)浏览器检查
    • (3)预检请求(如果需要)
    • (4)服务器响应预检请求
    • (5)浏览器处理预检响应
    • (6)发送实际请求
    • (7)Chrome 接收到服务器的响应。
  • 六、跨域请求的安全考虑
  • 七、跨域调试:前端开发者的必备技能
  • 八、结语


在这里插入图片描述


一、前言

在当今的 Web 开发中,跨域是一门必修课。今天,我们将一起踏上一段旅程,从同源策略的基础讲起,一路深入,直至掌握跨域的精髓。

二、同源策略:安全的守护神

同源策略,英文全称为 Same-Origin Policy,是浏览器为了保护用户数据安全而设立的一道防线。以下是一些由同源策略导致的限制:

  • AJAX 请求(通过 XMLHttpRequest )不能向不同源的服务器发送请求。
  • 不同源下的文档无法读取或修改对方的 DOM
  • 不同源的 CookieLocalStorageIndexedDB 无法互相访问。

所谓“源”,指的是协议、域名和端口号的组合。如果三者中有任何一项不同,即被视为“跨域”。

(1)协议(Protocol)

协议是一套规则,它定义了数据如何在网络上从一个设备传输到另一个设备。它规定了数据传输的格式、错误处理机制、数据交换的时序等。常见的网络协议包括:

  • HTTP (Hypertext Transfer Protocol):用于在Web服务器和客户端之间传输网页。
  • HTTPS (HTTP Secure):HTTP的安全版本,通过SSL/TLS加密来保护数据传输。
  • FTP (File Transfer Protocol):用于文件传输。
  • SMTP (Simple Mail Transfer Protocol):用于电子邮件发送。
  • IMAP/POP3:用于电子邮件接收。
  • TCP/IP (Transmission Control Protocol/Internet Protocol):是互联网的基础通信协议,其中TCP负责提供可靠的数据传输,而IP负责将数据包发送到正确的目的地。

(2)域名(Domain Name)

域名是互联网上网站的名称,它是用来代替IP地址的一种更易于记忆的字符串。域名通常由两部分组成:主机名和顶级域(TLD)。例如,在 www.example.com 这个域名中,www 是主机名,example 是二级域名,.com 是顶级域。
域名系统(DNS)负责将域名翻译成对应的IP地址,这样网络浏览器才能找到正确的服务器。

(3)端口号(Port Number)

端口号是一个 16位的数字,用于区分不同的网络服务进程。当数据包到达服务器时,端口号告诉服务器应该将数据发送到哪个服务或应用程序。一些端口号已经被分配给了特定的服务,例如:

  • 80:用于HTTP服务。
  • 443:用于HTTPS服务。
  • 21:用于FTP服务。
  • 25:用于SMTP服务。

端口号范围从 0到65535,其中 0到1023是系统端口,通常被分配给了知名的互联网服务。高于1023的端口号可以由用户或应用程序自由使用。
在网络地址后面,端口号通常通过一个冒号来指定,例如 www.example.com:8080,这表示访问 www.example.com 的服务器上运行在8080端口号的服务。

三、跨域问题的诞生

同源策略是浏览器的一项重要安全机制,它要求网页中的脚本在执行某些操作时,所访问的资源必须与当前网页的源(协议、域名、端口号)完全相同。同源策略的存在,使得这种跨域请求在默认情况下被浏览器无情地拦截。这正是跨域问题的由来。

跨域问题产生的原因主要有以下几点:

(1)分布式架构的发展

随着互联网应用的规模不断扩大,很多系统采用了分布式架构,不同的功能模块可能部署在不同的域名或端口下。当一个网页需要与其他域名或端口下的资源进行交互时,就会触发同源策略,导致跨域问题。
例如,一个网站的前端页面部署在 example.com,而其数据接口部署在 api.example.com,前端页面向数据接口发送请求时,就会被视为跨域请求。

(2)前后端分离的开发模式

在现代 Web 开发中,前后端分离成为常见的开发模式。前端和后端可能分别运行在不同的服务器和域名上,前端页面需要从不同域名的服务器请求数据,这增加了跨域请求的场景。

(3)第三方服务集成

许多网站需要集成第三方的服务或资源,如地图服务、社交登录等。这些第三方服务通常具有独立的域名,与当前网站的源不同,从而引发跨域问题。

(4)浏览器安全考虑

浏览器为了防止恶意网站通过脚本获取其他网站的敏感信息或进行未经授权的操作,严格限制了跨域访问。
例如,如果没有同源策略的限制,恶意网站可能通过脚本向用户经常访问的银行网站发送请求,获取用户的账户信息等敏感数据。

四、跨域解决方案:从古老到现代

(1)JSONP:古老而简单

JSONP 是跨域解决方案中最早出现的一种,它利用了 <script> 标签不受同源策略限制的特性。服务器返回的数据被包装在一段 JavaScript 函数调用中,前端通过动态创建 <script> 标签来加载并执行这段代码,从而获取数据。不过,JSONP 仅支持 GET 请求,且存在安全风险。

(2) CORS:现代与安全的典范

CORS,即 Cross-Origin Resource Sharing,是一种基于HTTP头的跨域资源共享机制,更是一种更现代、更安全的跨域解决方案。它允许服务器通过设置特定的HTTP响应头来显式地允许某些跨域请求。这些响应头包括 Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers等,它们告诉浏览器哪些源可以访问哪些资源以及可以使用哪些HTTP方法和头字段。与 JSONP 相比,CORS 不仅支持各种 HTTP 方法,还具备更强大的安全性和灵活性。

在这里,还得补充两个概念,简单请求与非简单请求:

  • 简单请求:如果请求满足一定条件(如请求方法为 GETHEADPOST,且 Content-Typetext/plainmultipart/form-dataapplication/x-www-form-urlencoded 之一),则浏览器会直接发送请求,并在响应中检查 CORS 相关的头字段。
  • 非简单请求:对于不满足简单请求条件的请求,浏览器会先发送一个 OPTIONS 请求作为“预检请求”(Preflight Request),询问服务器是否允许跨域请求。服务器在响应中设置CORS 相关的头字段后,浏览器才会发送实际的请求。

(3) document.domain:跨子域的捷径

在某些场景下,两个页面的主域名相同但子域名不同。通过将document.domain设置为共同的主域名,可以绕过同源策略的限制,实现跨子域的数据共享。但是,这种方法只适用于协议和端口号都相同的情况,并且存在一定的安全风险。

(4)window.postMessage:HTML5的安全通信通道

HTML5 引入的window.postMessage方法,允许不同源的窗口之间进行安全的数据传递。它不仅支持跨子域通信,还能够跨越完全不同的域名,为跨域通信提供了新的可能。但是,这种方法需要双方窗口的协作,并且不能用于 Ajax 请求。

(5)服务器代理:后端的桥梁

服务器代理是一种由前端请求同源服务器,再由同源服务器去请求外部服务并返回数据给前端的策略。虽然需要额外的服务器资源,但能够有效解决跨域问题,尤其是在企业级应用中。

五、跨域请求的幕后故事

Web 开发中,跨域请求是指从一个域协议+域名+端口)下的网页向另一个不同域的服务器请求数据的行为。由于浏览器的同源策略限制,默认情况下,JavaScript 不能进行 跨域 HTTP 请求。不过,现代浏览器提供了一些机制来安全地允许跨域请求。以下是使用Chrome浏览器进行跨域请求的一般过程:

(1)发起请求

用户在网页中触发一个跨域请求,例如通过 JavaScript 的 XMLHttpRequest 或 fetch API 向不同源的服务器发送请求。

(2)浏览器检查

Chrome 浏览器接收到请求后,会检查请求的源(协议 + 域名 + 端口)是否与当前页面的源不同。如果不同,确定为跨域请求。

(3)预检请求(如果需要)

对于“非简单请求”,Chrome 会先自动发送一个 OPTIONS 预检请求 到目标服务器。
预检请求的请求头中包含一些信息,如:

  • Origin 表明请求的来源;
  • Access-Control-Request-Method 说明实际请求将使用的方法;
  • Access-Control-Request-Headers 列出实际请求将包含的自定义请求头。

(4)服务器响应预检请求

服务器接收到预检请求后,根据其配置和安全策略决定是否允许该跨域请求。
如果允许,服务器在响应头中添加必要的 CORS 相关信息,如:

  • Access-Control-Allow-Origin 指定允许访问的源;
  • Access-Control-Allow-Methods 列出允许的请求方法
  • Access-Control-Allow-Headers 包含允许的请求头
  • Access-Control-Max-Age 表示预检请求结果的有效缓存时间。

(5)浏览器处理预检响应

Chrome 接收到预检请求的响应后,检查响应头中的 CORS 信息。
如果响应表明允许跨域请求,并且满足后续实际请求的条件,Chrome 会继续发送实际的跨域请求。

(6)发送实际请求

如果预检请求成功,Chrome 发送实际的跨域请求,请求头中仍然包含 Origin 字段。
服务器处理实际请求并响应
服务器接收到实际请求,进行处理,并在响应头中根据情况添加 CORS 相关信息。
浏览器接收响应

(7)Chrome 接收到服务器的响应。

如果响应头中的 CORS 信息表明请求成功(例如 Access-Control-Allow-Origin 与请求的源匹配),浏览器将响应数据传递给网页中的 JavaScript 代码进行处理。
如果 CORS 信息不满足要求或存在错误,浏览器会阻止 JavaScript 访问响应数据,并可能在控制台中显示错误信息。

六、跨域请求的安全考虑

跨域请求在带来便利的同时,也带来了安全风险。因此,在开发过程中需要特别注意以下几点:

  • 验证请求的合法性:服务器端需要对跨域请求进行验证,确保请求是来自可信的源。
  • 设置合适的 CORS 策略:根据实际需求设置合适的 CORS 策略,避免不必要的跨域访问。
  • 防止CSRF攻击:跨域请求可能会受到 CSRF跨站请求伪造)攻击的影响,因此需要采取相应的防护措施。

七、跨域调试:前端开发者的必备技能

通过浏览器开发者工具,可以查看网络请求的详细信息,包括请求和响应头,以及服务器返回的错误信息,帮助定位和解决跨域问题。使用开发者工具查看跨域请求数据的步骤:

  • 打开需要调试的网页,按下 F12 键打开开发者工具。
  • 切换到“Network”(网络)选项卡。
  • 当触发跨域请求时,可以在列表中看到相应的请求条目。
  • 点击请求条目,可以查看详细信息,包括:
    • Headers(请求头和响应头):可以查看 Origin 字段确认请求源,以及 Access-Control-Allow-OriginCORS 相关的响应头。
    • Preview(预览):对于一些常见的数据格式(如 JSONXML),可以直接预览响应的数据内容。
    • Response(响应):查看完整的响应正文。
  • 如果请求失败,在 Console(控制台)选项卡中会显示相关的错误信息,有助于排查问题。

例如,如果您的前端页面从 http://example.comhttp://anotherexample.com 发送跨域请求,在Network 中找到该请求后,可以查看响应头中是否正确设置了 Access-Control-Allow-Origin: http://example.com 来允许该跨域请求。如果请求失败,控制台可能会显示类似“CORS 策略阻止了访问”的错误信息。

八、结语

通过理解同源策略,掌握各种跨域解决方案,我们能够构建更加安全、高效、灵活的Web 应用。


版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/140712954

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

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

相关文章

esp-idf-v5.1.1所有官方例程讲解(esp32、esp32-C2、esp32-S3)之 a2dp_sink 详解

目录 1. 获取ESP-IDF和示例代码 2. 导航到示例代码 3. 示例代码结构 4. 关键文件解析 main.c 初始化和配置: bt_app_core.c 和 bt_app_core.h bt_app_av.c 和 bt_app_av.h A2DP事件处理: AVRCP事件处理: bt_app_sink.c 和 bt_app_sink.h 5. 编译和烧录 6. 测试…

新一代打工人用什么电脑桌面提醒的备忘录比较好?

在这个为了生活而起早贪黑的时代&#xff0c;新一代的打工人每天都需要处理大量的工作和信息。为了提高工作效率&#xff0c;选择一款合适的电脑桌面备忘录工具显得尤为重要。那么&#xff0c;什么样的备忘录工具才是最适合我们的呢&#xff1f; 首先&#xff0c;我们需要的是…

【研发日记】Matlab/Simulink技能解锁(十一)——Stateflow中的en、du、ex应用对比

文章目录 前言 项目背景 en类型 du类型 ex类型 组合类型 分析和应用 总结 参考资料 前言 见《【研发日记】Matlab/Simulink技能解锁(六)——六种Simulink模型架构》 见《【研发日记】Matlab/Simulink技能解锁(七)——两种复数移相算法》 见《【研发日记】Matlab/Simul…

机械拆装-基于Unity-本地数据持久化

目录 1. 数据结构简介&#xff1a;数据的集合 1.1 线性数据结构 1.2 非线性数据结构 2. 对数据集合的操作&#xff1a; 3. 数据持久化 3.1 数据的序列化存储 3.2 JSON文件硬盘存储 3.2.1 Json文件允许存储的数据类型 3.2.2 Json文件的语法格式 3.2.3 Json文件的读取 3.2.4 …

【C#】ThreadPool的使用

1.Thread的使用 Thread的使用参考&#xff1a;【C#】Thread的使用 2.ThreadPool的使用 .NET Framework 和 .NET Core 提供了 System.Threading.ThreadPool 类来帮助开发者以一种高效的方式管理线程。ThreadPool 是一个线程池&#xff0c;它能够根据需要动态地分配和回收线程…

yolov8pose 部署rknn(rk3588)、部署地平线Horizon、部署TensorRT,部署工程难度小、模型推理速度快,DFL放后处理中

特别说明&#xff1a;参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 之前写了yolov8、yolov8seg、yolov8obb 的 DFL 放在模型中和放在后处理…

XXE-lab-master靶场:PHP_xxe

目录 有回显 测试回显位置 构建payload 无回显数据外带 构建payload 漏洞修复 XXE-lab是一个一个包含php,java,python,C#等各种语言版本的XXE漏洞靶场。 下载地址&#xff1a;https://github.com/c0ny1/xxe-lab 将PHPStudy的中间件与版本信息调制为 php-5.4.29Apache 以…

UCC5320SCDWVR驱动SIC的功耗计算

驱动功耗可以通过分析器件的电气特性和推荐的电源电压来估算。以下是一些关键信息&#xff0c;用于估算功耗&#xff1a; 电源电流&#xff1a; 输入电源静态电流&#xff08;IVCC1​&#xff09;&#xff1a;最小值为1.67 mA&#xff0c;典型值为2.4 mA。输出电源静态电流&am…

计算机毕业设计选题推荐-零食批发商仓库管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

刷题了:226.翻转二叉树 | 101. 对称二叉树

226.翻转二叉树 文章讲解:https://programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html 视频讲解:https://www.bilibili.com/video/BV1sP4y1f7q7/?spm_id_from333.788&vd_sourcee70917aa6392827d1ccc8d85e19e8375 题目链接:https://leetcode.cn…

从PyTorch官方的一篇教程说开去(5 - 神经网络 torch.nn)

神经网络长啥样&#xff1f;有没有四只眼睛八条腿&#xff1f; 借图镇楼 - 真的是非常经典&#xff0c;可以给下面的解释省掉很多力气。 分3个维度阐述 - 1&#xff09;输入数据集。假如你自己去微调一下大模型就知道&#xff0c;最开始的一步就是要准备&#xff08;足够大…

视频生成AI工具——PixVerse V2 登场:支持一键生成5段、最长 40S 连续视频!

就在昨天&#xff0c;光源伙伴 「 爱诗科技 」正式发布其视频生成产品 PixVerse V2 , 并全球同步开放&#xff0c;更低门槛&#xff0c;更高质量&#xff0c;更有逻辑&#xff0c;更长时长&#xff0c;这几个“更”&#xff0c;让这款产品受到了超高关注&#xff0c;今天带大家…

GD32手把手教你移植FlashDB(片外Flash) -- 3.FlashDB使用

GD32手把手教你移植FlashDB(片外Flash) – 1.FlashDB-sfud移植 GD32手把手教你移植FlashDB(片外Flash) – 2.FlashDB移植 GD32手把手教你移植FlashDB(片外Flash) – 3.FlashDB使用 示例代码: https://gitee.com/ljmRD/GD32F427_FlashDB 3.FlashDB使用 main() /*************…

华为云上如何创建桶

目录 一、进入对象存储服务(OBS)页面,点击【创建桶】二、输入桶的相关信息三、获取 projectId四、获取 OBS Endpoint五、获取 AK/SK一、进入对象存储服务(OBS)页面,点击【创建桶】 二、输入桶的相关信息 可以勾选购买套餐: 点【立即创建】按钮完成桶的创建。 三、获取…

Vue3开源Tree组件研发:节点勾选支持v-model

自研Tree组件有两个原因&#xff1a;1. 目前开源UI对Tree组件的用户API不太友好&#xff0c;2. 提升Vue3组件自研能力。 目前已实现的功能见上面思维导图。想象Tree组件的一个使用场景&#xff1a;后台管理员通过Tree组件来完成用户角色授权&#xff0c;同时支持对权限进行新增…

【和相同的二元子数组】python刷题记录

R2-前缀和专题 目录 前缀和哈希表 双指针 ps: 第一眼过去&#xff0c;这题应该能用双指针解出来&#xff0c;应该也能用前缀和解题。 前缀和哈希表 适用于 nums[i] 值不固定为 0 和 1 的其他情况 class Solution:def numSubarraysWithSum(self, nums: List[int], goal: i…

揭秘高效语音转文字工具:让沟通更便捷

嘿&#xff0c;各位办公室的小伙伴们&#xff0c;今儿咱们来聊聊那些能让咱们文员生活大变样的神器——特别是那些能把咱们嘴里嘟囔的话儿&#xff0c;瞬间变成电脑里整整齐齐文字的语音转文字工具。说起来&#xff0c;自从有了这些宝贝&#xff0c;我感觉自己都快能飞起来了&a…

onlyoffice用nginx反向代理

我对于onlyoffice的需求就是当个在线编辑器使用。在集成react的时候之前都是写的绝对路径的地址&#xff0c;这样在需要迁移应用的时候就造成了巨大的麻烦&#xff0c;所以我决定用nginx做反向代理&#xff0c;这样我集成的时候就不用每次都修改源码中的地址了。 一开始写的代…

ETH现货ETF流入量估算:会重演BTC现货ETF走势吗?

以太坊现货ETF将于7月23日上线&#xff0c;成为市场关注的焦点。ETH ETF的推出带来了很多与BTC ETF不同的特性&#xff0c;这些特性容易被市场忽视。本文将探讨ETH现货ETF的流入量估算&#xff0c;并分析其是否会重演BTC现货ETF的走势。 ETHE流出量预测 ETH ETF的收费结构与BT…

生活方式酒店升势迅起,喆啡酒店缘何成为投资热点?

伴随国内消费结构转型升级&#xff0c;旅游需求持续增加。文旅部发布的《国内旅游提升计划&#xff08;2023—2025年&#xff09;》提出&#xff0c;需丰富优质旅游供给&#xff0c;并进一步提高消费者体验及满意度&#xff0c;这将为酒店行业带来更广阔的客源和更高的质量要求…