localStorage,sessionStorage跨域共享解决办法
localStorage只有同源的情况下(域名,协议,端口号都一致)才能在不同页面共享。
sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久就销毁了,不同页面或标签页间无法共享sessionStorage的信息。
共享也有条件限制,如果不能操作跨域页面是无法实现共享的。
sessionStorage生命周期比较特殊,需要用html5的的postMessage来实现,无法使用document.domain。
localStorage,sessionStorage跨域共享也是有条件限制的,就是相互共享的localStorage,sessionStorage域名能有修改的权限,如果你没有对应页面的修改权限,那么你不需要看此篇文章了。共享数据需要用html5的postMessage(跨顶级域名)或者设置document.domain='顶级域名'(跨二级域名),需要添加onmessage(接收数据的域名)和调用postMessage方法(数据源)传递数据给需要接收数据的域名,没有修改权限无法实现共享。
localStorage跨域二级域名共享解决办法
假设顶级域名为abc.com,二级域名为www.abc.com,还有其他n及域名或者多个二级域名。
实现方法:输出一个隐藏的iframe加载一个顶级域名的代理页面,统一在顶级域名设置localStorage,其他二级域名或者n级域名需要读取或者设置localStorage时通过此代理ifarme来执行操作
核心:iframe和当前页面都需要设置document.domain='abc.com',这样就可以相互操作对方了。
顶级域名代理页面http://www.abc.com/storageproxy.html代码如下
<script> document.domain = 'abc.com';//设置domain为顶级域名,这样其他二级或n及域名可以相互操作 function setItem(key, data) { localStorage.setItem(key, data); } function getItem(key) { return localStorage.getItem(key)} </script>
其他二级,n级域名页面测试代码test.html
<iframe style="display:none" id="ifrStorageProxy" src="http://www.abc.com/storageproxy.html"></iframe> <script> document.domain = 'abc.com';////关键 var winifrStorageProxy = document.getElementById('ifrStorageProxy').contentWindow; winifrStorageProxy.onload = function () {///注意要等待iframe加载完毕才能使用代理页面里面的函数 winifrStorageProxy.setItem('showbo', 'test-' + new Date().toLocaleString()); alert(winifrStorageProxy.setItem('showbo')); } </script>
localStorage,sessionStorage跨顶级域名共享解决办法
跨顶级域名需要html5的postMessage(IE8也支持此方法,但是IE8不支持localStorage,sessionStorage),假设顶级域名为abc.com,bcd.com。。。。其他顶级域名
思路:和二级域名localStorage跨域二级域名共享解决办法一样,任意选择一个域名,在这个域名下建立代理页面,然后需要共享localStorage,sessionStorage的页面输出iframe加载此代理页面,localStorage,sessionStorage数据存储在此顶级域名下,其他顶级域名通过此代理里面读取localStorage,sessionStorage数据
代理页面http://www.abc.com/storageproxy.html代码如下
<script> window.addEventListener('message', function (e) { if (e.source != parent) return;//不是父页发送的信息 var data = JSON.parse(e.data);//data为json格式字符串,格式如:{action:'setItem/getItem',key:'localStorage,sessionStorage存储的键名称',data:'setItem时的数据,如果是getItem省略'} switch (data.action) { case 'setItem': localStorage.setItem(data.key, data.data); break; case 'getItem': data = localStorage.getItem(data.key); parent.postMessage(data, '*');//向所有监听页面发送数据 break; } }, false); </script>
其他顶级域名页面测试代码test.html
<iframe style="display:none" id="ifrStorageProxy" src="http://www.abc.com/storageproxy.html"></iframe> <script> var winifrStorageProxy = document.getElementById('ifrStorageProxy') window.addEventListener('message', function (e) { if (e.source != winifrStorageProxy.contentWindow) return;//不是加载的iframe发送的信息 alert(e.data); }, false); winifrStorageProxy.onload = function () {///注意要等待iframe加载完毕,要不代理页onmessage未注册会没有反应 winifrStorageProxy.contentWindow.postMessage(JSON.stringify({ action: 'setItem', key: 'showbo', data: new Date().toLocaleString() }), '*');//发送存储指令 winifrStorageProxy.contentWindow.postMessage(JSON.stringify({ action: 'getItem', key: 'showbo' }), '*');//发送读取指令 } </script>
sessionStorage共享使用postMessage来解决,将上面的上面的localStorage改为sessionStorage即可。
加支付宝好友偷能量挖...
原创文章,转载请注明出处:localStorage,sessionStorage跨域共享解决办法