localstorage跨域解决方案
2023-09-14 08:57:36 时间
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(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/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
相关文章
- ajax跨域解决方案_java如何解决跨域问题
- 10 种CORS跨域解决方案
- PHP解决跨域问题
- vue07登陆注册--跨域请求问题+ base64编码+axios使用+面试题【v-bind和v-modul和{{}}的区别】
- 跨域的常见问题和解决方案
- JSON Web Token(缩写 JWT) 目前最流行、最常见的跨域认证解决方案,前端后端都需要会使用的东西
- 跨域资源共享CORS漏洞
- Vue的跨域解决方案
- vue跨域问题的三种解决方案_前端解决ajax跨域问题的方式
- vue跨域问题的三种解决方案_vue上线之后跨域问题
- nginx前端跨域_nginx实现跨域
- 通过定义过滤器filter解决跨域问题详解编程语言
- 基于Redis的SSO跨域认证实践(sso Redis跨域)
- Redis实现JSONP跨域请求(redis 转jsonp)