Web前端入门第 89 问:总结 8 种跨域通信处理方案

news/2025/10/28 10:56:50/文章来源:https://www.cnblogs.com/linx/p/19171207

为什么会跨域?跨域是谁附加的限制?为什么 APP 不会有跨域问题?

首先跨域问题是由于浏览器的同源策略(Same-Origin Policy)导致的,基本上所有浏览器都有限制,默认情况是不允许跨域访问的!!

APP 的请求不受浏览器的同源策略限制,所以不存在跨域。类似一个服务器像另一个服务器发起请求一样,也不会受跨域影响。

想想一下:如果浏览器没有同源策略限制,A 网站可以随意访问 B 网站内容,那么现在 BAT 这些一线大厂还有护城河吗?所有网站的数据都无隐私可言了,各种钓鱼网站在浏览器中横飞!!那世道...简直太美~~

什么是同源

同源:指的是协议、域名和端口都相同。任意一个不同,都会触发浏览器的同源策略,从而导致跨域。

以 MDM 的一个文档地址为例,看看 URL 不同的组成部分:https://developer.mozilla.org:443/zh-CN/docs/Web/JavaScript?a=b#hash

1

跨域解决方案

虽然默认情况下浏览器是不允许跨域访问的,但通过一些配置手段,还是能够实现资源共享~~

1、跨域资源共享 CORS

目前主流的跨域共享方案,由服务器配置响应头告诉浏览器是否允许跨域访问:

// 或 * 表示所有源都可以访问
Access-Control-Allow-Origin: https://domain.com
// 允许的方法
Access-Control-Allow-Methods: GET, POST, OPTIONS
// 允许的自定义头
Access-Control-Allow-Headers: Content-Type, Authorization
// 允许携带 Cookie
Access-Control-Allow-Credentials: true

2、反向代理

原理就是前端请求同源服务器,由同源服务器向跨域目标发起请求,再由同源服务器返回结果给前端。绕过了浏览器同源策略,但需要服务器支持,如果请求量太大,对自己的服务器要求很高。

比如 nginx / node 中间件 / 开发环境的 dev-server 都是这种方式,以 nginx 跨域配置为例:

location /api/ {proxy_pass https://domain.com/;  # 需要请求的跨域目标proxy_set_header Host $host;
}

3、WebSocket

WebSocket 是 HTML5 新增的协议,允许浏览器和服务器之间进行全双工通信,天然支持跨域访问。由于是双向通信,所以对服务器压力也不小。

const ws = new WebSocket('wss://domain.com');
ws.onmessage = (event) => console.log(event.data);

4、JSONP

利用 <script> 标签,向目标服务器发起请求,目标服务器需要返回一段函数调用,将数据返回给前端。缺点是仅支持 get 请求,还容易引发 XSS 攻击!

function handleResponse(data) {console.log(data);
}const script = document.createElement('script');
script.src = 'https://domain.com/data?callback=handleResponse';
document.head.appendChild(script);

https://domain.com/data?callback=handleResponse 需要返回 JS 代码调用函数执行:

handleResponse({ data: 'hello' });

5、postMessage

此方式一般多用于 iframe 的跨域通信,比如 A 网页使用 iframe 嵌入 B 网页,这种情况就可以使用 postMessage 通信:

发送者:

// 发送方
iframe.contentWindow.postMessage('data', 'https://target-domain.com');

接收者:

// 接收方
window.addEventListener('message', (event) => {if (event.origin !== 'https://source-domain.com') {return;}console.log(event.data);
});

不推荐的方案

浏览器的版本升级后,一些老旧的跨域方案被弃用,比如:

6、document.domain + iframe

在过去,如果同一个主域名,子域名不同的情况,比如:a.domain.com 和 b.domain.com 之间进行通信,可以通过设置 document.domain = 'domain.com' 来解决,但现在的浏览器已经限制使用了!!

7、window.name + iframe

此方案有一些复杂,需要一个空白的同源页面用于绕过浏览器的同源策略,然后获取 iframe 的 name 属性值,此处有大小限制,最多 2MB 的数据。

流程:

源页面A (domainA.com) ↓ 创建iframe指向代理页面B (domainB.com)
代理页面B (domainB.com) ↓ 接收数据并存入 window.name↓ 跳转至与A同源的空白页面C (domainA.com)
源页面A ↓ 访问iframe的window.name获取数据

流程图:

2

目前项目开发基本上已经不在使用这种方式,毕竟绕来绕去的,还不如一个 postMessage 跨域方案简单。

8、location.hash + iframe

通过修改 URL Hash 实现父子 iframe 间单向数据传输,虽然勉强也能算作一种跨域方案,但由于 URL 的长度限制,数据量也不能太大,实际使用中也不简单,所以项目上也很难见到它的身影~~

流程图:

3

写在最后

除了文章中这 8 种跨域方案外,还有一些单向数据通信的方法,比如说:

1、使用 Fetch API 的 no-cors 模式。
2、利用图片的 src 属性发起 GET 请求。
3、使用 sendBeacon 发送分析数据。

这些方法都只能向服务器发送数据,没办法获得服务器的响应,所以一般多用于一些数据统计,比如:百度统计、谷歌分析等等。

当然也有一些歪门邪道,比如说:修改浏览器的配置允许跨域,编写浏览器插件支持跨域等等。

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

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

相关文章

2025年10月中国办公家具定制公司推荐:评价排行榜与选购指南

正在升级办公环境的企业行政、采购或创业者,常面临“预算有限却想要品牌感”“工期紧张又怕环保不达标”“展厅看得眼花缭乱却找不到落地案例”的三重焦虑。2025年第三季度全国规模以上服务业景气指数显示,办公空间升…

如何理解Java中的并发?

Java 中的并发(Concurrency) 指多个任务在同一时间段内交替执行(宏观上同时进行,微观上可能是 CPU 快速切换调度),目的是提高程序效率,充分利用系统资源(如 CPU、内存、I/O 等)。 一、为什么需要并发?资源利…

ElasticSearch基本指令

ElasticSearch基本指令https://www.elastic.co/cn/ 在postman中,向ES服务器发put请求(增加索引): http://127.0.0.1:9200/shopping 在postman中,向ES服务器发get请求(查询索引): http://127.0.0.1:9200/shopping 在…

2025年无糖无汽苏打水厂家权威推荐榜单:无汽苏打水/pH值高的苏打水/白桃苏打水源头厂家精选

随着健康饮食理念的普及,无糖无汽苏打水市场正以每年超过20%的速度增长,成为饮料行业中备受关注的细分品类。 根据中国饮料工业协会最新数据显示,2024年无糖无汽苏打水市场规模已达85亿元,预计2025年将突破百亿大关…

BOS中设置实际精度为6位小数,前端显示1位小数

注意:配置掩码仅对H5端生效,需要配置“显示格式化字符串”,客户端才有显示1位小数效果。

ctfshow—web ssti 361-372

ctfshow_web-ssti (361~372) web 361 首先,题目提示,名字就是考点,所以应该是需要我们传一个name的参数 然后就是检查是什么模板 然后找到可以注入的模块,这里我找到的是os._wrap_close在132,找模块的数字我们可…

2025年克拉玛依旅游团综合实力TOP3排行榜:阿勒泰旅游/新疆喀纳斯旅游/新疆旅游服务商精选。

据新疆文旅厅数据统计,2024年新疆接待游客总量突破2.5亿人次,同比增长超过30%,其中定制化旅游服务需求增幅显著提升。 本文将根据企业资质、服务质量、资源整合能力及客户满意度等多维度数据,从多家旅行社中筛选出…

2025年塑料合金板材厂家权威推荐榜单:ABS吸塑板/真空吸塑板/ABS吸塑板源头厂家精选

在当今工业制造领域,塑料合金板材凭借其优异的综合性能,已成为汽车、电子、家电等行业的关键材料。根据最新行业研究报告显示,全球高性能塑料板材市场呈现持续增长态势,年复合增长率预计将保持在4.7%-8.9% 。在这一…

2025 年最新推荐西安路灯厂家排行榜:市政 / LED / 智慧 / 太阳能 / 农村路灯企业权威测评指南

引言 随着智慧城市建设与乡村振兴战略的深入推进,路灯行业对产品节能性、智能化与场景适配性的要求显著提升。为帮助采购方精准筛选优质厂商,中国照明电器协会联合西北市政工程设计研究院,对西安及周边区域路灯企业…

php rce的一些绕过

1.通配符?*绕过** 通配符是一种特殊语句,主要有问号(?)和星号(*),用来模糊搜索文件。?:在linux里面可以进行代替字母。?仅代表单个字符串,但此单字必须存在。 *:在linux里面可以进行模糊匹配。*可以代表任何字符…

2025 年污水离心泵,耐腐蚀离心泵,杂质离心泵,卧式离心泵厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读

引言 在工业流体输送领域,污水离心泵、耐腐蚀离心泵、杂质离心泵、卧式离心泵作为关键设备,其性能直接关系到生产效率与环保达标。为精准筛选优质厂家,本次推荐榜单由通用机械工业协会泵业分会指导测评,结合 12 项…

2025 年中压离心泵,高压离心泵,清水离心泵,立式离心泵厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读

引言 在工业流体输送领域,中压离心泵、高压离心泵、清水离心泵及立式离心泵作为关键设备,其性能与可靠性直接关系到生产效率与安全。为精准筛选优质厂家,2025 年度测评工作由通用机械工业协会泵业分会主导,联合多家…

ansible palybook

ansible palybookAnsible # ansible 简介 Ansible是一种常用的自动运维化工具,基于python开发,分布式,无需客户端,轻量级,配置语言采用YAML # Ansible 特点1.模块化:调用特定的模块,完成特殊的任务2.Paramiko(p…

2025信创浪潮下,ITSM 平台选型指南:国产方案如何选对 “运维服务引擎”

2025年信创关键期,国产ITSM从合规适配升级为价值赋能。文章对比主流ITSM产品的核心定位、能力及适用场景,从企业规模、核心需求、长期成本给出选型建议,助力企业选适配的ITSM平台。01. 国产化 ITSM 进入 “价值竞争…

MonoDevelop 的续集dotdevelop

https://www.cnblogs.com/shanyou/p/18415351DotDevelop 是一个跨平台的 .NET 集成开发环境(IDE),它原本是 MonoDevelop 的分支项目,这个项目更侧重于 Linux 支持和 GTK3 升级,github:https://github.com/dotdev…

time-ode项目结构

在Java中,ResponseEntity<PageInfo> 这样的命名和类型组合是一个典型的、遵循良好实践的Web API返回类型,常见于使用Spring框架(如Spring Boot)开发的后端服务中。下面我们来逐层解析其含义和命名的用意:Re…

Lombok 常用注解

分类 注解 作用‌ 常用参数/示例‌核心类注解‌ @Getter/@Setter 自动生成字段的 getter/setter 方法 @Setter(AccessLevel.PROTECTED) 指定访问权限@ToString 生成 toString() @ToString(exclude = "id")…

2025 年长沙美食餐厅最新推荐榜,食材溯源与管理创新双维度下的品质品牌解析

引言 长沙餐饮市场年均新增商户超 1.2 万家,但食品安全抽检不合格率仍达 3.1%,同质化与管理缺失成为行业痛点。为筛选品质标杆,湖南省餐饮行业协会联合黑珍珠评审委员会开展专项测评,覆盖 326 家候选餐厅,采用 “…

2025年新疆电线电缆厂家综合实力TOP3排行榜:耐火电缆/矿用电缆/高温电缆源头厂家精选。

在"一带一路"倡议深入推进与新能源产业快速发展的背景下,新疆电线电缆市场需求呈现多元化、高性能化趋势,品质可靠的本地厂家成为采购首选。 本文将根据技术实力、生产能力、产品质量及市场服务等多维度数…

2025年PPH管材厂家权威推荐榜单:抗冲击性管材/低导热性管材/环保性管材源头厂家精选

在工业流体输送、环保水处理及化工防腐等领域,PPH(均聚聚丙烯)管材凭借其卓越的耐腐蚀性、抗冲击性能及环保特性,已成为不可或缺的关键材料。随着市场需求持续增长,2024年PPH管材全球消费量预计将达到数百万吨级别…