前端跨域解決方案(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
英文地址,請注明出處:http://en.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;是替代進…