localstorage跨域问题

本文介绍了一种利用localStorage和postMessage解决泛域名下跨域问题的方法。通过在不同子域名间使用iframe通信,实现了用户登录信息的安全传递。

localstorage在泛域名下也存在跨域问题,要想解决这个问题可以通过postmessage。以登录为例,登录后获取的用户信息通过localstorage存储在A.xx.com下,若B.xx.com下的页面需要获取用户信息可以做如下操作:

A.xx.com           存储用户信息到localstorage

<!doctype html>
<html>
    <head>
        <style type="text/css">
            html,body{
                height:100%;
                margin:0px;
            }
        </style>
    </head>
    <body style="height:100%;">
        <script type="text/javascript">
             window.onload=function(){
                var user = JSON.stringify({
                    "uid":window.localStorage.getItem("uid"),
                    "nickname":window.localStorage.getItem("nickname"),
                    "avatar":window.localStorage.getItem("avatar"),
                    "token":window.localStorage.getItem("usertoken")
                });
                window.parent.postMessage(user,'*');
            }
           
        </script>
    </body>

</html>

B.xx.com   向A.xx.com发起消息获取用户信息

<!DOCTYPE html>
<html>
<head>
    <title>Post Message</title>
</head>
<body>
    <div style="width:200px; float:left; margin-right:200px;border:solid 1px #333;">
        <div id="color">Frame Color</div>
    </div>
    <div>
        <iframe id="child" src="http://A.xx.com"></iframe>//通过iframe发起消息
    </div>


    <script type="text/javascript">
        window.onload=function(){
            window.frames[0].postMessage('getuser','http://A.xx.com');
        }


        window.addEventListener('message',function(e){
            var user= JSON.parse(e.data);

            if(user.uid != null){

                //如果用户信息不为空 时逻辑               

                ...

            }else{

                //用户信息为空时逻辑

                ...
            }
            
        },false);
    </script>
</body>
</html>
### 解决 LocalStorage 存储的方法 #### 使用 `postMessage` 实现通信 为了克服浏览器的安全限制,可以利用 HTML5 的 `window.postMessage()` 方法,在不同源之间安全地传递消息。这种方法允许两个窗口或 iframe 之间的双向通信[^1]。 当 A 名下的页面想要向 B 名发送数据时,可以通过调用目标窗口对象的 postMessage 函数并指定接收方所在的 URL 和要传输的数据包。同样地,监听来自其他来源的消息事件以便处理接收到的信息[^2]。 ```javascript // 发送端代码 (A.xx.com) let targetWindow = document.getElementById('targetFrame').contentWindow; targetWindow.postMessage(JSON.stringify({ action: 'save', key: 'username', value: 'JohnDoe' }), '*'); // 接收端代码 (B.xx.com) window.addEventListener('message', function(event) { let data = JSON.parse(event.data); if (data.action === 'save') { localStorage.setItem(data.key, data.value); } }); ``` #### 利用共享 iFrame 进行间接访问 创建一个位于第三方服务器上的通用 iFrame 来充当中介角色,该 iFrame 可以被多个子名加载,并且这些子名都可以与其交互而不违反同源政策。通过这种方式,各个站点能够借助此中间件来进行本地存储的操作[^3]。 具体来说,可以在主站设置好相应的逻辑用于保存/读取所需信息到实际存在于辅助框架内的隐藏表单字段或其他持久化机制内;而客户端则只需简单地请求更新其自身的副本即可完成同步过程。 ```html <!-- 主页HTML结构 --> <iframe id="sharedIframe" src="//common-domain.com/shared-storage.html"></iframe> <script> document.querySelector('#sharedIframe').onload = () => { const frameWin = document.querySelector('#sharedIframe').contentWindow; // 向iFrame发送指令 frameWin.postMessage({ command: "set", name: "userToken", content: tokenValue, }, "*"); window.onmessage = e => console.log(`Received message from shared storage: ${e.data}`); }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值