一、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);
})

postMessage及webSocket跨域方案详解

✍如何跨域

上述我们提到了其他窗口的引用可以是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>

postMessage及webSocket跨域方案详解

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

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

postMessage及webSocket跨域方案详解

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端口打印如下

postMessage及webSocket跨域方案详解

3300端口打印如下

postMessage及webSocket跨域方案详解

✍兼容性

还是在IE有兼容问题

postMessage及webSocket跨域方案详解

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

二、webSocket

✍出现的原因

✍连接流程

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

✍兼容性

postMessage及webSocket跨域方案详解

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

跨域小结

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

发表回复