zoukankan      html  css  js  c++  java
  • localstorage跨域解决方案

    localstorage也存在 跨域的问题,

    【解决思路如下】

    在A域和B域下引入C域,所有的读写都由C域来完成,本地数据存在C域下;

    因此 A哉和B域的页面必定要引入C域的页面; 当然C域最好是主域,原因后面会提到(在localstorage 不方便的情况下使用cookie);

    【A域】【B域】需要读写时,通过postMessage 向【C域】发送跨哉消息,

    【C域】监听跨域消息,在接到批定的消息时进行读写操作,

    【C域】接到跨域消息时,如果是写入删除可以不做什么,如果是读取,就要先读取本域本地数据通过postMessage向父页面发送消息,

    【A 域 / B 域】在读取【C域】数据时就需要监听来自【C域】的跨域消息

    【注意事项】

    window.postMessage()方法,向【C域】发消息,应用iframe.contentWindow.postMessage() 这样iframe内的【C 域】才可以接到,

    同理,【C域】向 【A 域B域】发消息时应用,window.parent.postMessage()

    【A域、B域】的逻辑一定要在iframe 加载完成后进行

    【C域】的页面如下:

    根据域名请自行修改

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="robots" content="noindex">
        <title>cross domain</title>
    </head>
    <body>
    
    <script>
        ;(function(doc,win,undefined){
            var fn=function(){};
            fn.prototype={
                /*本地数据存储*/
                setLocalCookie: function (k, v, t,domain) {
                    typeof window.localStorage !== "undefined" ? localStorage.setItem(k, v) :
                            (function () {
                                t = t || 365 * 12 * 60 * 60;
                                domain=domain?domain:".hc360.com";
                                document.cookie = k + "=" + v + ";max-age=" + t+";domain="+domain+";path=/";
                            })()
                },
                getLocalCookie: function (k) {
                    k = k || "localDataTemp";
                    return typeof window.localStorage !== "undefined" ? localStorage.getItem(k) :
                            (function () {
                                var all = document.cookie.split(";");
                                var cookieData = {};
                                for (var i = 0, l = all.length; i < l; i++) {
                                    var p = all[i].indexOf("=");
                                    var dataName = all[i].substring(0, p).replace(/^[suFEFFxA0]+|[suFEFFxA0]+$/g,"");
                                    cookieData[dataName] = all[i].substring(p + 1);
                                }
                                return cookieData[k]
                            })();
                },
                clearLocalData: function (k) {
                    k = k || "localDataTemp";
                    typeof window.localStorage !== "undefined" ? localStorage.removeItem(k) :
                            (function () {
                                document.cookie = k + "=temp" + ";max-age=0";
                            })()
                },
                init:function(){
                    this.bindEvent();
                },
                bindEvent:function(){
                    var _this=this;
                    win.addEventListener("message",function(evt){
                        if(win.parent!=evt.source){return}
                        var options=JSON.parse(evt.data);
                        if(options.type=="GET"){
                            var data=tools.getLocalCookie(options.key);
                            win.parent.postMessage(data, "*");
                        }
                        options.type=="SET"&&_this.setLocalCookie(options.key,options.value);
                        options.type=="REM"&&_this.clearLocalData(options.key);
                    },false)
                }
            };
            var tools=new fn();
            tools.init();
        })(document,window);
    </script>
    </body>
    </html>
    

    【A域、B域 读取操作】

    【写】

    iframe.contentWindow.postMessage(JSON.stringify({type:"SET",key:"key",value:"value"}),'http://www.C.com');

    【读】

    iframe.contentWindow.postMessage(JSON.stringify({type:"GET",key:"key"}),'http://www.C.com');

    【删】

    iframe.contentWindow.postMessage(JSON.stringify({type:"REM",key:"key"}),'http://www.C.com');

    ---------------------
    原文:https://blog.csdn.net/sflf36995800/article/details/53290457

  • 相关阅读:
    PuTTY 私钥'putty/sshdss.c' 多个信息泄露漏洞
    PuTTY DSA签名远程缓冲区溢出漏洞(CVE-2013-4207)
    Apache CloudStack多个跨站脚本漏洞(CVE-2013-2136)
    phpMyAdmin 完整路径泄露漏洞3
    程序员必知的 七 种软件架构模式!
    【扩展知识】数据结构之动态内存管理机制!
    新年新气象,拼多多退出春晚红包合作,由抖音补位!
    【新年第一个程序】三子棋小游戏(C语言数组实现)
    编程开发中你必须了解的内存知识!从分配到使用直至出现Bug!
    C语言小写转大写,小写字母转换成大写字母!
  • 原文地址:https://www.cnblogs.com/7qin/p/10195986.html
Copyright © 2011-2022 走看看