postMessage与BroadcastChannel对比学习

介绍

  • BroadcastChannel:提供了一种简单的跨页面通信方式,即可以在同一个页面中的不同 iframe,也可以在不同的页面之间进行通信。最重要的是只能在同源页面之间进行通信
    • 若一个页面创建多个相同名称的通道,他们之间不会通信
    • 关闭通道前,请确认消息已经接收完成,否则会导致信息丢失
  • postMessage:可以在同一域名下的不同窗口或 iframe 之间进行通信,也可以在不同域名下的窗口或 iframe 之间进行跨域通信
    • 需要确保消息接收方窗口的源地址是可信的,并且只接受预期的消息类型和格式
    • 如果发送方和接收方在同一页面中,可以通过 window.postMessage() 方法来进行通信

使用

  • BroadcastChannel
// 创建或加入通道
const channel = new BroadcastChannel('channel-name');
// 发送消息
channel.postMessage(message: any);
// 接收消息
channel.addEventListener('message', ({data: any}) => {
    console.log(data);
})
// 异常处理
channel.addEventListener('messageerror', e) => {
    console.error(e);
})
// 断开连接
channel.close();
  - postMessage
// 发送消息
const message = {...};
const targetOrigin = 'https://xxx.com';
window.parent.postMessage(message, targetOrigin);
// 接收消息
window.addEventListener('message', event => {
  // 确保来源可信
  if (event.origin !== 'https://example.com') {
    return;
  }
  const message = event.data;
  ...
});

安全性

  • 使用postMessage进行跨域通信需要注意安全性问题
    • 消息源:通过event.origin验证消息源
    • 内容:通过定义消息格式和类型限制消息内容
    • XSS:对消息进行转义
    • XSRF:使用CSRF Token,或检查Referer
    • Dos:限制消息和频率的大小

实例

  • 由于项目中是在同一个网站不同页面间传递数据,故这里使用BroadcastChannel
  • 发送
this.channel = new BroadcastChannel('my-channel')
this.channel.postMessage({
  ...  
  uuid: this.$route.query.uuid,
})
  • 接收
this.channel = new BroadcastChannel('my-channel')
this.channel.addEventListener('message', (e) => {
  // 验证uuid
  if (e.data.uuid === this.uuid) {
    ...
  }
})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值