localStorage的跨与实现方案

实现原理:

HTML5 的 postMessage 为解决跨域页面通信提供了一套可控的机制, 而 localStorage 则提供了易用简洁的本地存储方案? 这两者结合起来,能否实现跨域的本地存储呢 ?

答案是可以的。假设有 a.com 和 b.com 两个页面。我们想通过 a 页面去修改 b 页面的本地数据。 我们需要做如下步奏:

  • 在 a 页面创建一个 iframe ,嵌入 b 页面
  • a 页面通过 postMessage 传递指定格式的消息给 b 页面
  • b 页面解析 a 页面传递过来的消息内容,调用localStorage API 操作本地数据
  • b 页面包装 localStorage 的操作结果,并通过 postMessage 传递给 a 页面
  • a 页面解析 b 页面传递回来的消息内容,得到 localStorage 的操作结果

下面简单的实现一下:

在A页面:

 1 /*
 2 API:
 3 csclient.get("http://b.test.com","name",callback);
 4 csclient.set("http://b.test.com","name","chenjian",callback);
 5 csclient.del("http://b.test.com","name",callback);
 6 */
 7 var csclient = (function () {
 8     var _get = function (url,key,fn) {
 9         var value = {
10             _key :key,
11             _method : "get"
12         };
13         getIframeWindow(url).postMessage(value,url);
14         //给window对象绑定message事件处理
15         addEvent(handMessage)
16     }
17
18     var _set = function (url,key,value,fn) {
19         var _value = {
20             _key : key,
21             _vaule :value,
22             _method : "set"
23         };
24         getIframeWindow(url).postMessage(_vaule,url);
25         //给window对象绑定message事件处理
26         addEvent(handMessage)
27     }
28
29     var _del = function () function (url,key,fn) {
30         var value = {
31             _key :key,
32             _method : "del"
33         };
34         getIframeWindow(url).postMessage(_vaule,url);
35         //给window对象绑定message事件处理
36         addEvent(handMessage)
37     }
38
39     function getIframeWindow (url) {
40         var _iframe = document.createElement("iframe");
41         _iframe.src = url;
42         _iframe.style.display = "none";
43         window.body.appendChild(_iframe);
44         var iframeWindow = _iframe.contentWindow;
45         return iframeWindow;
46     }
47     function addEvent(func) {
48         if (window.addEventListener) {
49             window.addEventListener("message", func, false);
50         }else{
51             window.attachEvent("onmessage", func);
52         }
53     }
54     function handMessage (event) {
55         var event = event || window.event;
56         //验证是否来自预期内的域,如果不是不做处理,这样也是为了安全方面考虑
57         if(event.origin === url){
58             //处理传过来的数据;
59             fn(event.data);
60         }
61     }
62     return {
63         get : _get,
64         set : _set,
65         del : _del
66     }
67 })();

在B页面:

 1 /*
 2 API:
 3 cshub.init("http://a.test.com");
 4 */
 5 var cshub = (function () {
 6     var _cshub = function (url) {
 7         addEvent(handMessage);
 8         function handMessage(event) {
 9             var event = event || window.event;
10             //验证是否来自预期内的域,如果不是不做处理,这样也是为了安全方面考虑
11             if(event.origin === url){
12                 if(event.data._method=="get") {
13                     getFn(event.data._method)
14                 }else if (event.data._method=="set") {
15                     setFn(event.data._method)
16                 }else {
17                     delFn(event.data._method)
18                 }
19             }
20         }
21         function addEvent(func) {
22             if (window.addEventListener) {
23                 window.addEventListener("message", func, false);
24             }else{
25                 window.attachEvent("onmessage", func);
26             }
27         }
28
29         function getFn (data) {
30             window.parent.postMessage(window.localStorage["data._key"],url);
31         }
32
33         function setFn (data) {
34             window.localStorage["data._key"] = data._value;
35             window.parent.postMessage("设置成功");
36         }
37
38         function delFn (data) {
39             window.localStorage.removeItem("data._key");
40             window.parent.postMessage("删除成功");
41         }
42     }
43     return {
44         init : _cshub
45     };
46 })();

上面的代码徒手写的没做测试,如果有误还望指出。谢谢

时间: 2024-12-10 14:57:38

localStorage的跨与实现方案的相关文章

(CORS)跨域资源共享方案

在XMLHttpRequest对象访问跨域资源的时候的一些被认可的跨域访问资源的方案叫 (CORS)跨域资源共享方案. 在ie8中,可以通过XDomainRequest进行CORS,而在其他的浏览器中可以通过XHR对象 即可进行CORS. 代码取自javascript高级程序设计3版: 1 function aCORSRequest(method,url){ 2 3 var xhr = new XMLHttpRequest(); 4 5 if('withCredentials' in xhr){

Kafka 跨集群同步方案(转)

Kafka 跨集群同步方案——Kafka内置的MirrorMaker工具 该方案解决Kafka跨集群同步.创建Kafka集群镜像等相关问题,主要使用Kafka内置的MirrorMaker工具实现. Kafka镜像即已有Kafka集群的副本.下图展示如何使用MirrorMaker工具创建从源Kafka集群(source cluster)到目标Kafka集群(target cluster)的镜像.该工具通过Kafka consumer从源Kafka集群消费数据,然后通过一个内置的Kafka prod

非常全的跨域实现方案

由于同源策略的限制,满足同源的脚本才可以获取资源.虽然这样有助于保障网络安全,但另一方面也限制了资源的使用. 那么如何实现跨域呢,以下是实现跨域的一些方法. 一.jsonp跨域 原理:script标签引入js文件不受跨域影响.不仅如此,带src属性的标签都不受同源策略的影响. 正是基于这个特性,我们通过script标签的src属性加载资源,数据放在src属性指向的服务器上,使用json格式. 由于我们无法判断script的src的加载状态,并不知道数据有没有获取完成,所以事先会定义好处理函数.服

Kafka 跨集群同步方案

该方案解决Kafka跨集群同步.创建Kafka集群镜像等相关问题,主要使用Kafka内置的MirrorMaker工具实现. Kafka镜像即已有Kafka集群的副本.下图展示如何使用MirrorMaker工具创建从源Kafka集群(source cluster)到目标Kafka集群(target cluster)的镜像.该工具通过Kafka consumer从源Kafka集群消费数据,然后通过一个内置的Kafka producer将数据重新推送到目标Kafka集群. 图片描述(最多50字) 一.

Django解决跨域俩方案

方案一:一套干掉全部Primary 首先你的pip下载一个第三方库贼厉害的: pip install corsheaders 然后在项目的setting.py里面引入第三方库,如下: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django

Docker 跨主机网络方案分析

overlay 俗称隧道网络,它是基于 VxLAN 协议来将二层数据包封装到 UDP 中进行传输的,目的是扩展二层网段,因为 VLAN 使用 12bit 标记 VLAN ID,最多支持 4094 个 VLAN,这对于大型云网络会成为瓶颈,而 VxLAN ID 使用 24bit 来标记,支持多达 16777216 个二层网段,所以 VxLAN 是扩展了 VLAN,也叫做大二层网络. overlay 网络需要一个全局的“上帝”来记录它网络中的信息,比如主机地址,子网等,这个上帝在 Docker 中是

iframe跨域通信方案

概述 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首先什么是跨域,简单地理解就是因为JavaScript同源策略的限制,a.com 域名下的js无法操作b.com或是c.a.com域名下的对象.更详细的说明可以看下表: 对于主域相同子域不同的通信方法这里不一一列举了,这里主要讲解一下跨主域的通信问题. postMessage方法 window.postMe

etcd跨机房部署方案

使用ETCD做为元数据方便快捷,但是谈到跨机房灾备可能就迷糊了,我们在做节日灾备的时候同样遇到了问题, 通过查阅官方文档找到了解决方案,官方提供make-mirror方法,提供数据镜像服务 注意: make-mirror 的使用需要依赖于API版本3, 使用API2的无法通过该工具做数据同步 有关ETCD的编译安装这里就不在说明了, 不明白的可以参考官方说明:https://github.com/coreos/etcd 1. 启动集群1 #!/bin/bash nohup etcd --name

js事件跨浏览器处理方案

js跨浏览器事件工具: //事件工具对象 var EventUtil = {}; //添加事件 EventUtil.addEvent = function(element,type,handle) { if(element.addEventListener) { //dom事件 element.addEventListener(type,handle,false); } else if(element.attachEvent) { element.attachEvent("on" +