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页面:
/*
API:
csclient.get("http://b.test.com","name",callback);
csclient.set("http://b.test.com","name","chenjian",callback);
csclient.del("http://b.test.com","name",callback);
*/
var csclient = (function () {
var _get = function (url,key,fn) {
var value = {
_key :key,
_method : "get"
};
getIframeWindow(url).postMessage(value,url);
//给window对象绑定message事件处理
addEvent(handMessage)
} var _set = function (url,key,value,fn) {
var _value = {
_key : key,
_vaule :value,
_method : "set"
};
getIframeWindow(url).postMessage(_vaule,url);
//给window对象绑定message事件处理
addEvent(handMessage)
} var _del = function () function (url,key,fn) {
var value = {
_key :key,
_method : "del"
};
getIframeWindow(url).postMessage(_vaule,url);
//给window对象绑定message事件处理
addEvent(handMessage)
} function getIframeWindow (url) {
var _iframe = document.createElement("iframe");
_iframe.src = url;
_iframe.style.display = "none";
window.body.appendChild(_iframe);
var iframeWindow = _iframe.contentWindow;
return iframeWindow;
}
function addEvent(func) {
if (window.addEventListener) {
window.addEventListener("message", func, false);
}else{
window.attachEvent("onmessage", func);
}
}
function handMessage (event) {
var event = event || window.event;
//验证是否来自预期内的域,如果不是不做处理,这样也是为了安全方面考虑
if(event.origin === url){
//处理传过来的数据;
fn(event.data);
}
}
return {
get : _get,
set : _set,
del : _del
}
})();
在B页面:
/*
API:
cshub.init("http://a.test.com");
*/
var cshub = (function () {
var _cshub = function (url) {
addEvent(handMessage);
function handMessage(event) {
var event = event || window.event;
//验证是否来自预期内的域,如果不是不做处理,这样也是为了安全方面考虑
if(event.origin === url){
if(event.data._method=="get") {
getFn(event.data._method)
}else if (event.data._method=="set") {
setFn(event.data._method)
}else {
delFn(event.data._method)
}
}
}
function addEvent(func) {
if (window.addEventListener) {
window.addEventListener("message", func, false);
}else{
window.attachEvent("onmessage", func);
}
} function getFn (data) {
window.parent.postMessage(window.localStorage["data._key"],url);
} function setFn (data) {
window.localStorage["data._key"] = data._value;
window.parent.postMessage("设置成功");
} function delFn (data) {
window.localStorage.removeItem("data._key");
window.parent.postMessage("删除成功");
}
}
return {
init : _cshub
};
})();
上面的代码徒手写的没做测试,如果有误还望指出。谢谢
localStorage的跨与实现方案的更多相关文章
- H5中用postMessage传递数据,解决localStorage不能跨域问题
localStorage不能跨域,所以在A域名下用localStorage.YourKey方式存储的值,在B域名下是不能取到的. 所以需要转变思路,目前主要使用的两种方式: 一种方式:在A.B两个页面 ...
- SNF快速开发平台MVC-EasyUI3.9之-WebApi跨域处理方案
在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案.由于时间有限,本文不会深入. 笔者遇到的问题是Js调用WebAPI中的数据进行跨域的场景.涉及若干跨域方案:目前采用we ...
- Kafka 跨集群同步方案(转)
来自:http://tangzhaohui.net/524 Kafka 跨集群同步方案——Kafka内置的MirrorMaker工具 该方案解决Kafka跨集群同步.创建Kafka集群镜像等相关问题, ...
- Docker系列04—跨主机网络方案(overlay/weave)
在前面详细讲解了几种网络模式:none,host,bridge,container.他们解决了单个主机间的容器的通信问题,并不能实现多个主机容器之间的通信. 跨主机网络方案包括两大类: 1,docke ...
- Docker 跨主机网络方案分析
PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...
- MongoDB集群跨网络、跨集群同步方案
MongoDB集群跨网络.跨集群数据同步有以下几个方案,此处只是简单介绍,不过详细描述. 1.MongoDB自带的复制方案 优点:实施简单,不需要额外的技术栈 缺点:网络双向可连通. 2.CDC同步方 ...
- Django解决跨域俩方案
方案一:一套干掉全部Primary 首先你的pip下载一个第三方库贼厉害的: pip install corsheaders 然后在项目的setting.py里面引入第三方库,如下: INSTALLE ...
- iframe跨域通信方案
概述 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首先什么 ...
- 解决浏览器跨域限制方案之CORS
一.什么是CORS CORS是解决浏览器跨域限制的W3C标准,详见:https://www.w3.org/TR/cors/. 根据CORS标准的定义,在浏览器中访问跨域资源时,需要做如下实现: 服务端 ...
随机推荐
- 一个人写的操作系统 - Sparrow OS
一个人写的操作系统 - Sparrow OS 自己写一个操作系统,这是在过去的几年里我一直为之努力的目标,现在终于完成了. 缘起 自己动手写操作系统的动机最初来自于学习Linux遇到的困难. 我是一个 ...
- javascript js 内存泄露
JavaScript 内存泄露 1.什么是闭包.以及闭包所涉及的作用域链这里就不说了. 2.JavaScript垃圾回收机制 JavaScript不需要手动地释放内存,它使用一种自动垃圾回收机制(ga ...
- input标签写CSS时需要注意的几点(先收藏)
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-05-05) 飞鱼的声纳顶部的搜索框让我头疼了很长时间,原因是总不能获得跨浏览器的统一样式.主要的问题有这么两个:一是inpu ...
- jquery视频展示 图片轮播
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- EXTJS项目实战经验总结一:日期组件的change事件:
1 依据选择的日期,加载相应的列表数据,如图: 开发说明 1 开发思路: 在日期值变化的事件中获得选择后的日期值,传给后台,然后从后台加载相应的数据 2 问题:在查看extjs2.2 的a ...
- Programming pages of Jasper Neumann
http://programming.sirrida.de/ Discussion topics Bit permutations Download source files List of func ...
- iOS设置某个界面强制横屏,进入就横屏
最近有一个项目,例如:A界面跳转到B界面,A界面是竖屏的,B界面进入就要横屏. 花了半天的时间在网上搜索解决方案,有些论坛的大牛也就贴两行代码,具体实现也没有,对我们这种菜鸟造成一万点真实伤害.为了避 ...
- Delphi Data Type to C# Data Type
Delphi DataType C# datatype ansistring string boolean bool byte byte char char comp double currency ...
- Java学习笔记之深入理解引用
引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解 ...
- Navicat 导入数据报错 --- 1153 - Got a packet bigger than 'max_allowed_packet' bytes
在用Navicat导入SQL文件时报错:MySql 错误 Err [Imp] 1153 - Got a packet bigger than 'max_allowed_packet' bytes 查了 ...