如何跨域使用 window.postMessage?

在前端开发中,我们经常需要与其他域名下的页面进行通信。然而,由于浏览器的同源策略(Same-Origin Policy),JavaScript 脚本只能访问与当前页面同源的资源,无法跨域访问其他页面。

为了解决这个问题,HTML5 引入了 window.postMessage 方法。该方法可以实现不同域名下的窗口之间相互通信,而不受 SOP 的限制。

postMessage() 方法

postMessage()Window 接口的一个方法,用于向其他窗口传递信息。

-------------------------------- ------------- ------------

它接收三个参数:

  • message: 所要发送的数据。可以是任意基本类型或可复制的对象。
  • targetOrigin:指定目标窗口的源,格式为协议 + 主机名 + 端口号。如果不确定目标窗口的源,可以将此参数设置为“*”,表示任意源。
  • transfer (optional):可选项,表示要传递的对象是否应被转移所有权,从而避免复制大量数据。

如何使用 postMessage() 跨域通信?

下面是一个例子:假设有两个网站,一个是 https://example.com,另一个是 https://www.example.net。我们需要在这两个网站之间实现通信。

在父窗口中发送消息

--- ----------- - -------------------------------------- ---------
--- ------- - -
  ----- ------- -------
--
-------------------------------- ---------------------------

在此示例中,我们通过 window.open() 方法打开一个新窗口,并将其赋值给变量 childWindow。然后,我们定义了一个包含数据的对象 message,并将其作为第一个参数传递给 postMessage() 方法。最后,我们将目标源设置为 https://www.example.net

在子窗口中接收消息

---------------------------------- --------------- -
  -- ------------- --- ---------------------- -------

  --- ------- - -----------
  --------------------- ------- ---- --------- ---------
---

在子窗口中,我们使用 window.addEventListener() 方法监听 message 事件。当父窗口调用 postMessage() 方法发送消息时,子窗口会触发 message 事件并执行回调函数。在回调函数中,我们首先检查消息的来源是否为 https://example.com,以防止恶意网站发送虚假信息。然后,我们获取消息内容,并将其输出到控制台。

总结

使用 window.postMessage() 可以轻松地实现不同域名之间的通信。但是,在使用它时,必须小心谨慎,避免被黑客利用。下面是一些建议:

  • 确保目标源是否正确,避免接收到来自不可信的网站的消息。
  • 不要在被攻击者的页面中使用 postMessage() 方法,以防止被注入恶意代码。
  • 只接收来自指定源的信息,避免接收到不受欢迎的消息。

希望这篇文章对您有所帮助!

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/12238