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标准的定义,在浏览器中访问跨域资源时,需要做如下实现: 服务端 ...
随机推荐
- Could not load file or assembly 'MagickNet.dll'
1 确定项目中bin目录下存在该DLL文件 2 安装 VC++发布组件_缩略图用_x86(1).exe
- VS 2010下单元测试
1.创建单元测试项目 2.创建完成后,新建项目会自动添加“Microsoft.VisualStudio.QualityTools.UnitTestFramework”的引用,该引用用于单元 ...
- maven的学习系列(四)—创建maven项目注意事项
文件夹: <1> 中央工厂的位置 <2>mvn archetype:generate <3>Eclipse配置maven <4>在Eclipse中创建简 ...
- 05_android入门_GET方式实现登陆(在控件上显示服务端返回的内容)
当点击登陆之后,怎么把server端返回的数据,写到指定的控件上尼?,在android怎么实现尼?以下我们通过详细的代码进行分析和实现,希望能对你,在学习android知识上有所帮助. 以下通过代码说 ...
- hdu 4499 Cannon dfs
Cannon Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4499 D ...
- (高精度运算4.7.26)POJ 1220 NUMBER BASE CONVERSION(高精度数的任意进制的转换——方法:ba1----->10进制----->ba2)
package com.njupt.acm; import java.math.BigInteger; import java.util.Scanner; public class POJ_1220_ ...
- Cocos2d-x--开发参考资料
1.CocoStudio使用指南 所用版本:CocoStudio v3.0.0 Cocos2d-x1.5b 自己网上查找并整理的一些资料,留下做个纪念,也希望对有需要的人有点帮助 链接地址:http: ...
- 次表面散射(SubSurface Scattering) Shader 【转】
原文 http://www.azure.com.cn/article.asp?id=231 用深度值近似模拟物体的厚度,厚度越小处透光越多. varying vec4 position;varying ...
- WCF入门教程(三)属性标签
属性标签,成为定义协议的主要方式.先将最简单的标签进行简单介绍,以了解他们的功能以及使用规则. 服务协定标识,标识哪些接口是服务协定,哪些操作时服务协定的一部分,以及传输对象的定义.如果已经有所了解, ...
- onConfigurationChanged is not called&& 翻转屏幕不执行onConfigurationChanged方法&&onConfigurationChanged不执行
我总结出一句话: 如果target sdk>=13,必须使用如下方式声明activity:android:configChanges="orientation|screenSize&q ...