前端跨域解决方案(4):postMessage

1 postMessage 核心

postMessage 是现代浏览器提供的跨域通信标准 API,允许不同源的窗口(如主页面与 iframe、弹出窗口、Web Worker)安全交换数据。相比其他跨域方案,它的核心优势在于:

  1. 双向通信能力:支持消息的发送与接收,形成完整的通信闭环

  2. 安全可控性:通过targetOriginevent.origin严格校验消息源,防止恶意攻击

  3. 跨场景兼容性:适用于 iframe 嵌套、多标签页同步、Web Worker 等多种场景

  4. 数据灵活性:支持对象、数组、Blob 等复杂数据类型(基于结构化克隆算法)

1.1 核心 API

1.1.1 发送消息安全传递数据到目标窗口

otherWindow.postMessage(message, targetOrigin);

参数

描述

otherWindow

目标窗口引用,可通过以下方式获取:
・iframe 的 contentWindow
• window.open() 返回的窗口
• window.parent(子窗口访问父窗口)

message

要发送的数据,支持 结构化克隆算法(可包含对象、数组、Blob 等,但需避免函数、DOM 节点)。

targetOrigin

严格限制接收方的源(格式:protocol://domain:port),防止消息被恶意窗口截获。
建议:始终使用具体域名(如 https://trusted.com),避免使用 *

示例:父窗口向 iframe 发送配置数据

// 父窗口代码
const iframe = document.getElementById('myIframe');
iframe.contentWindow.postMessage({ type: 'init', config: { theme: 'dark' } },'https://child-domain.com' // 严格指定iframe的域名
);

1.1.2 接收消息监听并处理跨域数据

window.addEventListener('message', (event) => {const { data, origin, source } = event;// 1. 校验消息来源(安全关键)if (origin !== 'https://trusted.com') {console.warn('未知来源的消息:', origin);return;}// 2. 处理消息数据(根据约定的格式)switch (data.type) {case 'login':console.log('用户登录信息:', data.user);break;case 'logout':// 执行登出逻辑break;}// 3. 可选:回复消息(通过source窗口)source.postMessage({ status: 'received' }, origin);
});
属性描述
event.data发送方传递的数据(类型与发送时一致)。
event.origin发送方的源(如 https://sender.com),用于安全校验。
event.source发送方的窗口引用,可用于回复消息(调用 source.postMessage())。

2 实战案例

2.1 服务端A(servera.js)

// 引入Express框架,这是一个基于Node.js的快速、灵活的Web应用框架
const express = require('express');
// 创建一个Express应用实例,用于处理HTTP请求和响应
const app = express();
// 配置Express应用使用静态文件中间件,指定从'public'文件夹中提供静态资源(如HTML、CSS、图片等)
app.use(express.static('public'));
// 定义应用监听的端口号,3000是前端开发中常用的非特权端口
const port = 3000;
// 启动服务器并监听指定端口,当服务器成功启动后执行回调函数
app.listen(port, () => {// 在控制台输出服务器运行的地址信息,方便开发者确认服务启动状态console.log(`Server is running on http://localhost:${port}`);
});

2.2 静态页面A(a.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>a</title>
</head>
<body><!-- 插入id为"b-iframe"的iframe元素,指向http://localhost:4000/b.htmlonload事件在iframe资源加载完成后触发handleIframeLoad函数 --><iframe id="b-iframe" src="http://localhost:4000/b.html" onload="handleIframeLoad()"></iframe><script>// 定义目标源,与iframe的源保持一致,用于postMessage安全校验const targetOrigin = 'http://localhost:4000';// iframe加载完成后的处理函数function handleIframeLoad() {// 通过contentWindow获取iframe的window对象,用于跨窗口通信let bWindow = document.getElementById('b-iframe').contentWindow;// 向iframe发送消息,第二个参数指定目标源防止恶意窗口接收bWindow.postMessage('hello', targetOrigin);}// 监听当前窗口的message事件,接收来自其他窗口的跨域消息window.addEventListener('message', function(event) {// 输出接收到的消息内容(包含event.data、event.origin等安全信息)console.log('Received message: ', event.data);}, false);</script>
</body>
</html>

2.3 服务端B(serverb.js)

// 引入Express框架(基于Node.js的Web应用开发框架,提供路由、中间件等功能)
const express = require('express');
// 创建Express应用实例(核心对象,用于处理HTTP请求和响应)
const app = express();
// 配置静态资源中间件(指定从'public'文件夹中读取HTML、CSS、图片等静态文件)
app.use(express.static('public'));
// 定义服务器监听的端口号(4000为自定义端口,需确保未被其他服务占用)
const port = 4000;
// 启动服务器并绑定端口(回调函数在服务启动成功后执行)
app.listen(port, () => {// 控制台输出服务运行地址(便于开发者确认服务状态和访问路径)console.log(`Server is running on http://localhost:${port}`);
});

2.4 静态页面B(b.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>b</title>
</head>
<body><script>// 监听当前窗口的message事件,用于接收其他窗口发送的跨域消息window.addEventListener('message', function(event) {// 输出消息发送方的window对象(可用于回复消息)console.log(event.source); // Window // 输出消息发送方的源(协议+域名+端口),用于安全校验console.log(event.origin); // http://localhost:3000// 向消息发送方返回响应消息,第二个参数指定目标源为发送方的源event.source.postMessage('world', event.origin);}, false);</script>
</body>
</html>

3 适用场景

场景类型

典型应用案例

微前端架构

主应用与子应用通过 iframe 嵌套,使用 postMessage 传递路由、状态等信息

多标签页同步

电商网站中,用户在 A 标签页添加商品,B 标签页实时更新购物车数量

Web Worker 通信

主线程与 Web Worker 通过 postMessage 交换计算任务和结果

跨域文件操作

本地文件选择器页面与主应用通过 postMessage 传递 File 对象

postMessage 作为浏览器原生跨域方案,通过 “消息订阅 - 发布” 模式实现了安全可控的跨窗口通信。在实际应用中,结合 Web Worker、Service Worker 等技术,可构建更复杂的跨域应用架构。如需处理高频实时通信(如在线协作、游戏),可结合 WebSocket 方案;对于服务端跨域需求,CORS 与代理服务器仍是主流选择。

通过合理设计消息协议与安全策略,postMessage 能在保证用户数据安全的前提下,高效解决前端开发中的跨域通信难题。

下一章将介绍 websocket 方案 ,敬请期待!

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

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

相关文章

大语言模型指令集全解析

在大语言模型的训练与优化流程中&#xff0c;指令集扮演着关键角色&#xff0c;它直接影响模型对任务的理解与执行能力。以下对常见指令集展开详细介绍&#xff0c;涵盖构建方式、规模及适用场景&#xff0c;助力开发者精准选用 为降低指令数据构建成本&#xff0c;学术界和工…

OpenCV CUDA模块设备层-----用于封装CUDA纹理对象+ROI偏移量的一个轻量级指针类TextureOffPtr()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 TextureOffPtr<T, R> 是 OpenCV 的 CUDA 模块&#xff08;opencv_cudev&#xff09;中用于封装 CUDA 纹理对象 ROI 偏移量 的一个轻量级指…

Python 数据分析10

2.3.3其他 除了前面所介绍的常用语数据挖掘建模的库之外&#xff0c;还有许多库也运用于数据挖掘建模&#xff0c;如jieba、SciPy、OpenCV、Pillow等。 1.jieba jieba是一个被广泛使用的Python第三方中文分词库。jieba使用简单&#xff0c;并且支持Python、R、C等多种编程语言的…

css 制作一个可以旋转的水泵效果

如图&#xff0c;项目里面有一个小图片可以旋转&#xff0c;达到看起来像是一个在工作的水泵。我使用css旋转动画实现。 一、HTML结构部分 <div className"ceshixuanzhuan"><img src{lunkuo} className"lunkuo"/><img src{yepian} classN…

数据结构期末程序题型

一、 队列 1、简单模拟队列排列 #include<bits/stdc.h> using namespace std; int main(){int n;cin>>n;queue<int>q;string str;while(true){cin>>str;if(str"#")break;if(str"In"){int t;cin>>t;if(q.size()<n){q.pu…

SpringCloud+Vue汽车、单车充电桩源码实现:从架构设计到核心模块解析

智慧充电管理平台技术实现&#xff1a;从架构设计到核心模块解析 智慧充电管理平台作为新能源汽车生态的核心基础设施&#xff0c;需要实现充电设备管理、订单处理、数据统计分析等复杂功能。本文将从技术架构、核心模块设计、关键技术实现三个维度&#xff0c;深度解析平台的…

Kafka入门及实战应用指南

1、Kafka概述 Apache Kafka是由LinkedIn公司于2010年开发的一款分布式消息系统&#xff0c;旨在解决当时传统消息队列&#xff08;如ActiveMQ、RabbitMQ&#xff09;在高吞吐量和实时性场景下的性能瓶颈。随着LinkedIn内部对实时日志处理、用户行为追踪等需求的激增&#xff0…

智能指针 c++

C 智能指针详解 智能指针是 C11 引入的内存管理工具&#xff0c;位于 <memory> 头文件中&#xff0c;用于自动管理动态分配的内存&#xff0c;防止内存泄漏。主要类型如下&#xff1a; 1. std::unique_ptr (独占所有权) 特点&#xff1a;唯一拥有所指对象&#xff0c;不…

Python应用八股文

大家好!在 Python 学习的道路上&#xff0c;掌握一些基础知识要点至关重要&#xff0c;这些要点常被称为“Python 八股”。以下是对它们的简易总结&#xff0c;帮助你快速回顾和巩固 Python 的核心概念。 一、数据结构 列表&#xff08;List&#xff09;&#xff1a;有序可变序…

【技术深度】领码SPARK破解微服务数据依赖困局:架构设计与实践指南

——深度解析分布式数据冗余与异步消息机制&#xff0c;驱动企业数字化转型加速 ✨ 核心摘要 本文从技术架构与工程实现的角度&#xff0c;系统讲解领码SPARK融合平台如何精准解决微服务架构下数据依赖“卡脖子”问题。通过设计高效的数据冗余模型和完善的异步消息更新机制&am…

关于前端的防抖和节流

给我解释下 前端开发中的防抖和节流 并举个具体的例子 防抖&#xff08;Debounce&#xff09;与节流&#xff08;Throttle&#xff09;详解 在前端开发中&#xff0c;防抖&#xff08;Debounce&#xff09; 和 节流&#xff08;Throttle&#xff09; 是两种优化高频触发事件的…

React-router 多类型历史记录栈

react-router 为了满足开发者更多路由历史存储场景&#xff0c;提供了以下几种模式&#xff1a; 浏览器原生历史记录 浏览器 hash 内存型 服务端记录 以上实现分别对应于一下 API 实现&#xff1a; createBrowserRouter&#xff1a;浏览器提供的历史管理。 createHashRou…

java设计模式[3]之结构型模式

文章目录 一 代理模式1.1 静态代理1.1.1 静态代理的结构1.1.2 静态代理的特点1.1.3 静态代理的应用场景1.1.4 静态代理的案例代码 1.2 JDK动态代理1.2.1 JDK动态代理概述1.2.2 JDK动态代理案例代码1.2.3 JDK动态代理的应用场景1.2.4 JDK动态代理的特点1.2.5 与创建型模式的区别…

鸿蒙Harmony测试-wukong稳定性工具(类似Android的Monkey测试)

一、功能介绍 wukong是系统自带的一种命令行工具&#xff0c;支持Ability的随机事件注入、控件注入、异常捕获、报告生成和对Ability数据遍历截图等特性。通过模拟用户行为&#xff0c;对系统或应用进行稳定性压力测试。wukong分为随机测试、专项测试和专注测试。 随机测试是指…

从零学起VIM

前言 笔者早年刚入行的时候就接触过Vim,当时还是真正的菜鸟&#xff0c;带我的师父是一个华为骨干员工&#xff0c;犹记得他给我指导如何保存并关闭文本&#xff1a;按Esc&#xff0c;然后输入:wq。还记得自己打开Vim编辑器&#xff0c;一个字符都敲不进去&#xff0c;然后问旁…

不依赖rerank 模型排序通过使用 PostgreSQL 中的 pgvector 与 tsearch2 函数进行混合搜索提高召回率

前言 在向量搜索中&#xff0c;召回率是一个关键指标&#xff0c;它衡量搜索结果的相关性。然而&#xff0c;提高召回率往往会牺牲其他指标&#xff0c;如索引大小或查询延迟。为了平衡这些权衡&#xff0c;混合搜索技术应运而生。本文将介绍如何在 PostgreSQL 中结合 pgvecto…

Uniapp 跨平台开发框架全面解析:一次开发,多端运行

在移动互联网时代&#xff0c;开发者面临着一个重要挑战&#xff1a;如何高效地开发出能在多个平台&#xff08;iOS、Android、Web、小程序等&#xff09;上运行的应用&#xff1f;传统的原生开发方式需要为每个平台单独编写代码&#xff0c;导致开发周期长、维护成本高。而 Un…

ios如何把H5网页变成主屏幕webapp应用

一、将 H5 页面添加到主屏幕的步骤 打开 Safari 浏览器 在 iPhone 上打开 Safari 浏览器&#xff0c;访问目标网页&#xff08;H5 页面&#xff09;。 点击分享按钮 在 Safari 浏览器底部点击 “分享” 图标&#xff08;箭头向上的按钮&#xff09;。 添加到主屏幕 在分享菜单…

Node.js 项目启动命令大全 (形象版)

文章目录 Node.js 项目启动命令大全 &#x1f31f;✨&#xff08;形象版&#xff09;一、&#x1f50d; 如何查看项目启动命令&#xff08;魔法书目录&#xff09;package.json scripts 参数详解开发相关脚本测试相关脚本构建相关脚本代码质量相关脚本最佳实践 二、&#x1f68…

爱普特APT32F1104C8T6单片机 高抗干扰+硬件加密双保障

爱普特APT32F1104C8T6单片机深度解析 1. 产品定位 APT32F1104C8T6 是爱普特半导体&#xff08;APT&#xff09;推出的 32位高性能经济型单片机&#xff0c;基于 ARM Cortex-M0内核&#xff0c;采用 LQFP48封装&#xff0c;主打 高性价比、低功耗、强抗干扰&#xff0c;是替代进…