HTML5 localStorage与document.domain设置问题
localStorage的写入和读取,不能跨子域,否则在一些移动端浏览器上,会出现读取不到的情况。
最近开发一个移动端的播放记录功能,在pc端和android版的chrome测试很顺利通过了,但后来进行多平台测试的时候,悲剧发生了。。
掉进localStorage的坑里
android版本UC、iphone及ipad mini版的safari,localStorage跨页面读取不到数据,必须要重启浏览器后才能够正常的读取到数据。
爬出localStorage的坑
首先怀疑的可能是localStorage的访问方式的问题,写入的方式是属性设置localStorage.history而读取是api的方式localStorage.getItem,demo后确认localStorage的三种访问方式都是没有问题的。
思维短路了,开始思考如何规避这个跨页面无法读取的问题,首先想到的是尝试下sessionStorage,浏览器运行期间将数据保存在“session”中,后来发现有着同样的问题。
继续思考能够跨页面保存“大数据”的方式,“灵光”闪现,window.name应该是可以跨页面保存的,试了下各种设备确认这种方案确实可行,但是风险是任何页面都有可能重写掉这个name,甚至会有安全问题。
用极简的demo测试,发现这些有问题的浏览器对localStorage的支持是没问题的。在几乎要放弃的时候,同事跑过来说,将某个文件提前到head里,可以正常的读取数据,这是才意识到播放器的前置代码里没有显示的设置document.domain,导致读取和设置localStorage在不同的domain下面发生的。
在写入localStorage的页面方法之前没有显示的设置document.domain,默认的值为 labs.wxnet.me,但是在读取的页面,读取数据之前显示的设置了document.domain为根域wxnet.me
将问题环境抽象为demo
写入数据的页面 http://labs.wxnet.me/labs/writelocalstorage.html
//document.domain默认值为子域 labs.wxnet.me
localStorage['k'] = '{"a":"1"}';
document.domain = "wxnet.me";
读取数据的页面 http://labs.wxnet.me/labs/readlocalstorage.html
document.domain = "wxnet.me";
alert(localStorage['k']);
解决方案
读取和设置localStorage的页面必须要统一document.domain,要么全部不显示设置或统一设置为根域。
设置页面:
document.domain = "wxnet.me";
localStorage['k'] = '{"a":"1"}';
读取页面:
document.domain = "wxnet.me";
alert(localStorage['k']);
思考
不同的移动版浏览器在处理子域方式不同,iphone、ipad mini子域下写入,主域下是无法读取的,重启浏览器后忽略掉这个安全策略,可以读到数据。但是ipad、pc版的浏览器没有发现这个问题。
HTML5 localStorage与document.domain设置问题的更多相关文章
- 跨域cors方法(jsonp,document.domain,document.name)及iframe性质
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- 跨域问题实践总结! 上(JSONP/document.domain/window.name)
1. JSONP 首先要介绍的跨域方法必然是 JSONP. 现在你想要获取其他网站上的 JavaScript 脚本,你非常高兴的使用 XMLHttpRequest 对象来获取.但是浏览器一点儿也不配合 ...
- js设置document.domain实现跨域
document.domain 只能实现跨子域的问题 如:xxx.com/a.html 和aaa.xxx.com/b.html 或:bbb,xxx.com/c.html 和ccc.xxx.com/d. ...
- 设置document.domain实现js跨域注意点
转自:http://www.cnblogs.com/fsjohnhuang/archive/2011/12/07/2279554.html document.domain 用来得到当前网页的域名.比如 ...
- [跨域]js设置document.domain实现跨域
document.domain用来得到当前网页的域名.比如在地址栏里输入: 代码如下: javascript:alert(document.domain); //www.jb51.net 我们也可以给 ...
- HTML5 LocalStorage 本地存储原理详解
首先自然是检测浏览器是否支持本地存储.在HTML5中,本地存储是一个window的属性,包括localStorage和sessionStorage,从名字应该可以很清楚的辨认二者的区别,前者是一直存在 ...
- HTML5 LocalStorage 本地存储
HTML5 LocalStorage 本地存储 说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就 ...
- (转载)HTML5 LocalStorage 本地存储
原文地址:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html HTML5 LocalStorage 本地存储 说到本地 ...
- 【转】HTML5 LocalStorage 本地存储
原文见:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html 说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步 ...
随机推荐
- Vue源码学习三 ———— Vue构造函数包装
Vue源码学习二 是对Vue的原型对象的包装,最后从Vue的出生文件导出了 Vue这个构造函数 来到 src/core/index.js 代码是: import Vue from './instanc ...
- [优化]Steamroller-freecodecamp算法题目
晚上在medium看到一篇关于找工作的文章,里面提到一个面试题目--flattening an array(扁平化数组).这我好像在哪看过!应该是freecodecamp里的算法某一题.翻了下博客记录 ...
- 浅谈mysql权限
一. 背景: “去IOE”的本质是“分布式+开源”架构替代“集中式+封闭”架构,变成彻底的云计算服务模式.去“IE”易,并且应该去,关键确实能省钱,而且运维难度不大,替代技术产品成熟.而去O ...
- Javascript简单特效及摘要
1.js中的Element对象 ** var input1=docuemnt.getElementById("input1"); //alert(input1.value); // ...
- c#字符显示转换{0:d} string.Format()
这一篇实际和前几个月写的没什么本质上的区别.但是这篇更明确一点,学起来easy c#字符显示转换{0:d} C#:String.Format数字格式化输出 : int a = 12345678; // ...
- phpstorm 安装XeDbug
第一步:根据phpinfo()下载相对应的Xdebug插件,Xdebug下载路径https://xdebug.org/download.php 第二步:将下载好的Xdebug放到 G:\Service ...
- poj 2674 线性世界 弹性碰撞
弹性碰撞的题目一般都是指碰到就会掉转方向的一类题目,这里我们可以忽略掉头,仅仅看成擦肩而过,交换名字等等 题意:一条线上N只蚂蚁,每只蚂蚁速度固定,方向和坐标不同,碰头后掉头,求最后掉下去那只蚂蚁的名 ...
- Mysql处理海量数据时的一些优化查询速度方法【转】
最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法.由于在参与的实际项目中发现当mysql表的数据量达到百万级时,普通SQL查询效率呈直线下降,而且如果wher ...
- 十、mysql之索引原理与慢查询优化
mysql之索引原理与慢查询优化 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还 ...
- 解决不了bug的时候看一下:
解决不了bug的时候看一下: 1.机器是不会出错的,出错的一定是人.只是你还没有意识到哪里出了错. 2.产生bug 的原因想错了,你以为是系统的bug ,那么你肯定就不想着去解决,你也就解决不了. 这 ...