为了账号安全,请及时绑定邮箱和手机立即绑定

postMessage可以进行跨端口通信吗?

postMessage可以进行跨端口通信吗?

潇潇雨雨 2019-03-07 14:11:41
window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。参考自:https://developer.mozilla.org...这里的跨源是否指的就是跨域?查了一下关于postMessage的使用基本都是iframe向父窗口传数据,那是不是不同协议和不同端口是无法通信的呢?比如说我在localhost:3000启动一个页面,localhost:3500启动一个页面,可不可以进行通信呢btn.addEventListener('click', () => {                try {                    postMessage('helloWorld','localhost:3000' );                    console.info('消息已经成功发送')                } catch (error) {                    console.error(error)                }            })我自己试了一下,会有报错,但是执行时成功的这是不是说只能在子页面或者iframe这种情况下发送数据,不同端口不可以通信?
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

下面回答题主的其他问题:

可以跨域通信

如果跨域失败是另一种提示,Access-Control-Allow-Origin,,,,,

https://img3.sycdn.imooc.com/5c89b5430001820206580133.jpg

跨域包含跨端口,可以自行百度下什么是跨域,大概是:协议,域名,端口有一个不同,就是跨域。


查看完整回答
反对 回复 2019-03-14
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

postMessage是可以进行跨域通信的。MDN中描述的跨源就是通常意义上的跨域。语法如下:

otherWindow.postMessage(message, targetOrigin, [transfer]);

这里的otherWindow指的是其他窗口的引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。
所以此时的targetOrigin和otherWindow的引用必须是相互匹配的,否则不能进行通信。也就是要和谁进行通信就要拿到谁的引用。
关于window.open有一点需要特别注意的就是:要通过window.open获取引用值,必须是在window.open打开页面成功打开的情况下才会返回该窗口的引用,否则返回null。因为有的浏览器会处于安全机制拦截非用户点击的自弹出窗口,此时window.open是无法获取正常返回值的,postMessage也会失败。


查看完整回答
反对 回复 2019-03-14
  • 2 回答
  • 0 关注
  • 918 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号