文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

postMessage及webSocket跨域方案详解

2022-11-13 18:13

关注

一、postMessage

我们在上一篇小白也能搞懂的JSONP和CORS跨域方案已经说过两种跨域方案了,这一篇就再继续讲讲postMessagewebsocket这两种方案,它们也能算得上是跨域方案?

✍是什么

✍语法

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

通过以上叙述我们能够了解到它的作用就是可以安全地给目标窗口发送自定义的信息

✍怎么用

有信息的发送,自然也要有信息的接收,我们可以采用addEventLister,监听message事件: 该事件接收到消息时触发

const data = {
  name : '某车',
  like:  '前端'
}
//传入的message为data,targetOrigin为http://127.0.0.1:5500/
window.postMessage(data, 'http://127.0.0.1:5500/');
window.addEventListener('message',(event)=>{
//监听该回调事件并打印
  console.log(event);
})

✍如何跨域

上述我们提到了其他窗口的引用可以是iframecontentWindow属性,也可以是window.open的返回值那么我们就都来试试看

iframe + postMessage

//a.html
 <!-- 使用iframe,src指向3301端口 -->
<iframe src="http://127.0.0.1:3301/b.html" id="frame" onload="load()"></iframe>
<script>
const data = {
  name : '某车',
  like:  '前端'
}
const load = function(){
  //负责发布消息
  let frame = document.getElementById('frame'); 
  const targetWindow = frame.contentWindow;//得到目标窗口的引用
  targetWindow.postMessage(data, 'http://127.0.0.1:3301'); //发送新消息
  //也监听信息
  window.onmessage = function(event) {
    console.log(event.data)
  }
}
</script>

    //b.html
    window.addEventListener('message',(event)=>{
      console.log(event.data);
      event.source.postMessage('我可以回发消息给你', event.origin);
    })

3300端口页面的打印 (图片端口号打错了,懒得修改了..)

window.open()+postMessage

先认知一下window.open()语法

window.open(url, [name], [configuration])

还是上面的思路,我们让3300端口3301端口发送信息

   //a.html
  <button class="openWindow">打开窗口</button>
  <script>
    const btn = document.querySelector('.openWindow');
    const data = {
      name : '某车',
      like:  '前端'
    }
    //点击之后,执行window.open()
    btn.addEventListener('click', ()=>{
     const targetWindow =  window.open('http://127.0.0.1:3301/b.html', '3001端口'); //拿到目标窗口的引用
     setTimeout(()=>{
      targetWindow.postMessage(data, 'http://127.0.0.1:3301/'); //发送数据
     },1000)
    })
    //同时监听message事件
    window.addEventListener('message',(event)=>{
      console.log(event.data);
    })
  </script>
    //b.html
    window.addEventListener('message',(event)=>{
      console.log(event.data);
      event.source.postMessage('我可以回发消息给你', event.origin);
    })

3301端口打印如下

3300端口打印如下

✍兼容性

还是在IE有兼容问题

小结:postMessage()方法允许来自不同源的脚本进行有限的通信,只要能获取到源和窗口对象就可以实现跨域消息传递

二、webSocket

✍出现的原因

✍连接流程

Connnection:Upgrade  //表示要升级协议
Upgrade: websocket //表示要升级为websocket协议
Sec-webSocket-Version:13 //版本

✍兼容性

为什么说它是解决跨域的方案:因为它本身就不受同源策略的限制,客户端可以和任意服务器之间进行通信

跨域小结

以上就是postMessage及webSocket跨域方案详解的详细内容,更多关于postMessage webSocket跨域的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯