不同域名之间共享localStorage/sessionStor
2019-10-17 本文已影响0人
wlchn
问题
两个不同的域名的localStorage不能直接互相访问。那么如何在aaa.com
中如何调用bbb.com
的localStorage?
实现原理
1.在aaa.com
的页面中,在页面中嵌入一个src为bbb.com
的iframe
,此时这个iframe
里可以调用bbb.com
的localStorage。
2.用postMessage
方法实现页面与iframe
之间的通信。
综合1、2便可以实现aaa.com
中调用bbb.com
的localStorage。
优化iframe
我们可以在bbb.com
中写一个专门负责共享localStorage的页面,例如叫做page1.html
,这样可以防止无用的资源加载到iframe
中。
示例
以在aaa.com
中读取bbb.com
中的localStorage的item1
为例,写同理:
bbb.com
中page1.html
,监听aaa.com
通过postMessage
传来的信息,读取localStorage,然后再使用postMessage
方法传给aaa.com
的接收者。
<!DOCTYPE html>
<html lang="en-US">
<head>
<script type="text/javascript">
window.addEventListener('message', function(event) {
if (event.origin === 'https://aaa.com') {
const { key } = event.data;
const value = localStorage.getItem(key);
event.source.postMessage({wallets: wallets}, event.origin);
}
}, false);
</script>
</head>
<body>
This page is for sharing localstorage.
</body>
</html>
在aaa.com
的页面中加入一个src为bbb.com/page1.html
隐藏的iframe
。
<iframe id="bbb-iframe" src="https://bbb.com/page1.html" style="display:none;"></iframe>
在aaa.com
的页面中加入下面script标签。在页面加载完毕时通过postMessage
告诉iframe
中监听者,读取item1
。监听bbb.com
传回的item1
的值并输出。
<script type="text/javascript">
window.onload = function() {
const bbbIframe = document.getElementById('bbb-iframe');
bbbIframe.contentWindow.postMessage({key: 'item1'}, 'https://bbb.com');
}
window.addEventListener('message', function(event) {
if (event.origin === 'https://bbb.com') {
console.log(event.data);
}
}, false);
</script>