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跨域共享解决办法

评论(0)Web开发网
阅读(785)喜欢(0)JavaScript/Ajax开发技巧