javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > postMessage webSocket跨域

postMessage及webSocket跨域方案详解

作者:mouche

这篇文章主要为大家介绍了postMessage及webSocket跨域方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、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跨域的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文