由于最近有项工作要用到本地存储方式来存储用户的一些信息,所以花了点时间搜集了一下现有的一些本地存储方式,并做了一些比较,在这里做个记录,以后遇到类似的问题,要用什么方法心中也多少有个数。
目前已有的本地存储方式:
一、传统的:
1. Cookie:各浏览器都基本支持,可控制生命周期,但缺点是有大小限制,1个cookie最多存储4096±1B(大约为4KB)大小的数据,一个域名下最多存储20个cookie;而且有可能会被客户端禁用掉。
2. UserData:可控生命周期,切存储容量得到扩充,单个文件大小为128KB,一个域名下可存储1024KB的文件,缺点是只能在windows+IE 环境。
3. Flash:大小得到扩充,且各个浏览器都支持,但是需要在用的地方都引入.swf文件和大量的js,比较繁琐。
二、Html5给出的:共同缺点是低端版本的浏览器会不支持,且浏览器实现方式会有差异
1. Web Storage:
1) localStorage:大小得到扩充,大多数桌面浏览器会设置每个来源5MB的限制,chrome和Safari对每个来源的限制是2.5MB,iOS的Safari和Android的WebKit的限制也是2.5MB,不受窗口的影响。缺点是一经初始化后就长期存储在本地,不受会话长短的影响,若想删除必须得手动清理。
2) sessionStorage:大小得到扩充,对sessionStorage的大小限制因浏览器而异,有的浏览器对其没有大小限制,但chrome、Safari、iOS版的Safari和Android版的WebKit有限制,大小也是2.5MB,IE8+和Opera对其限制是5MB。生命周期为一个会话周期,即从打开到关闭浏览器窗口,当然,必须是在线用户。必须是同一窗口,不同窗口之间的sessionStorage是不同的。
2. GlobalStorage:
在浏览器关闭以后,使用globalStorage存储的信息仍能够保留下来,和sessionStorage一样,同一域中任何一个页面存储的信息都能被所有的页面共享。缺点是目前只有FF支持,且只支持当前域下的globalStorage存储。
3. IndexedDB:
支持保存结构化的数据,与Mysql和web SQL database等数据库类似,不过其最大特色是使用对象保存数据而不是用表保存。
条件:
1. 在本项目中,登录后利用接口得到的用户信息会有一个过期时间,过了那个时间后用户想进行其他操作必须重新登录。
2. 使用环境为移动端,都支持html5的Web Storage 存储,当然也支持cookie。
3. 要考虑以后的发展。
兼容性方面,userData和globalStorage不满足要求;flash过于麻烦,而且还要浏览器有相应扩展;只在本地存储单个用户的数据,不必用到indexed DB;localStorage不能够自动清除,在这里不需要持久化保存数据,假设一个设备有另一个人使用,在这里就会有问题。只剩下sessionStorage和cookie:
Cookie:能够根据服务器端设置的用户信息有效时间来设置其自身的存在时间;有被禁用的可能,但是与服务器的对话的session ID通常情况下依赖于cookie,若要考虑禁用cookie,那很多策略都要修改,且使用环境为移动端,禁用可行性更低。
SessionStorage:基本没有被禁用的风险,但是在一个会话周期内它都有效,假如服务端数据已经过期,但是本地窗口并未关闭,仍然能使用sessionStorage,但是这问题也并不大,因为本来保存的就是该用户已有体系中的数据,就算重新从服务端获取也还是这些。
考虑到未来的发展,各浏览器厂商对html5的支持越来越好,最后我还是采用了sessionStorage。