标签:
这一块自己学习了有一阵子了,但是今天看面试题的时候,让说一下cookie的弊端以及web storage与cookie的区别,竟然还是不知道从何说起,所以,还是要自己认真的梳理一遍。
支持离线的Web应用开发,是HTML5的一个重点。离线Web应用,就是在设备不能上网的时候依然可以运行的应用。
开发离线Web应用需要几个步骤:
1、确保应用知道设备能否上网,以便下一步执行正确的操作。可以使用HTML5定义的navigator.onLine属性来检测。
2、应用必须在离线的时候能够访问一定的资源(图像,js,css等),只有这样才能正常工作。
3、必须有一块本地空间用于保存数据,无论能否上网都不影响读写。
下面介绍一下数据存储的两种方式:Cookie 和Web Storage
Cookie
的作用我想大家都知道,这个作用就像你去超市购物时,第一次给你办张购物卡,这个购物卡里存放了一些你的个人信息,下次你再来这个连锁超市时,超市会识别你的购物卡,下次直接购物就好了。通俗地说,就是当一个用户通过 HTTP 协议访问一个服务器的时候,这个服务器会将一些 Key/Value 键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器的时候,数据又被完整地带回给服务器。
Cookie最初是在客户端用于存储会话信息的,其要求服务器对任意HTTP请求发送Set-CookieHTTP头作为响应的一部分。cookie
以name为名称,以value为值,名和值在传送时都必须是URL编码的。浏览器会存储这样的会话信息,在这之后,通过为每个请求添加Cookie
HTTP头将信息发送回服务器。
Cookie在性质上是绑定在特定的域名下的,当设置了一个cookie后,再给创建它的域名发送请求时,都会包含这个cookie,这确保了储存在cookie中的信息智能让批准的接收者访问,而不能被其他域访问。可以通过document.cookie属性来设置cookie
var CookieUtil = {
get: function (name){
var cookieName = encodeURIComponent(name) + "=",
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null,
cookieEnd;
if (cookieStart > -1){
cookieEnd = document.cookie.indexOf(";", cookieStart);
if (cookieEnd == -1){
cookieEnd = document.cookie.length;
}
cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd));
}
return cookieValue;
},
set: function (name, value, expires, path, domain, secure) {
var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);
if (expires instanceof Date) {
cookieText += "; expires=" + expires.toGMTString();
}
if (path) {
cookieText += "; path=" + path;
}
if (domain) {
cookieText += "; domain=" + domain;
}
if (secure) {
cookieText += "; secure";
}
document.cookie = cookieText;
},
unset: function (name, path, domain, secure){
this.set(name, "", new Date(0), path, domain, secure);
}
};
cookie虽然在持久保存客户端数据方面提供了方便,分担了服务器存储的负担,但还是有很多局限性的。
考虑到安全应当使用session
。考虑到减轻服务器性能方面,应当使用cookie
。单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
所以个人建议: 将登陆信息等重要信息存放为session, 其他信息如果需要保留,可以放在cookie中
Web Storage 的目的是克服由cookie带来的一些限制,当数据需要被严格控制在客户端时,无需持续的将数据发回服务器。其主要目的在于:
Storage类型提供最大的存储空间(因浏览器而异)来存储名值对儿。其只能存储字符串,非字符串数据会在存储之前被转换成字符串。
方法:
clear();//删除所有值,Firefox未实现;
getItem(name);//根据指定的name获取对应的值
key(index);//获得index位置处的值的名字
removeItem(name);//删除由name指定的名值对
setItem(name,value);//为指定的name设置value值
存储特定于某个会话的数据,该数据只保持到浏览器关闭。
存储在sessionStorage中的数据可以跨越页面刷新而存在;
sessionStorage对象主要用于仅针对会话的小段数据的存储。所以不详细介绍
目的:跨越会话存储数据。要使用globalStorage对象,首先要指定哪些域可以访问该数据,通过方括号标记来实现:
//保存数据
globalStorage["wrox.com"].name = "Vicky";
//获取数据
var name = globalStorage["wrox.com"].name;
在使用globalStorage对象时最好要指定域名,如果事先不能确定域名,那么使用location.host作为属性名比较安全。
如果不使用removeItem()或者delete删除,或者用户未清除浏览器缓存,存储在globalStorage属性中的数据会一直保存在磁盘上,因此globalStorage很适合在客户端存储文档或者长期保存用户偏好设置。
localStorage对象是HTML5中取代globalStorage的持久保存客户端数据的方案。要访问同一个localStorage对象,页面必须来自同一个域名,使用那个同一种协议,在同一个端口上。这相当于globalStorage[location.host].
保存在localStorage和globalStorage中的数据一样,数据保留到通过JavaScript删除或者是用户清除浏览器缓存
//客户端数据存储,持久保存客户端数据的方案,适用于长期保存用户偏好设置!
function getLocalStorage () {
if (typeof localStorage == "object") {
return localStorage;
} else if (typeof globalStorage == "object") {
return globalStorage;
} else {
throw new Error ("Local storage not available")
}
}
总结一下:
在较高版本的浏览器中,js提供了
sessionStorage
和globalStorage
。在HTML5中提供了localStorage
来取代globalStorage。
html5中的Web Storage
包括了两种存储方式:sessionStorage和localStorage。
sessionStorage
用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。
而localStorage
用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
1、Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用。
2、除此之外,Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie。
3、但是cookie也是不可以或缺的:cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生。
【JavaScript】Cookie and Web Storage
标签:
原文地址:http://blog.csdn.net/xiaozhuxmen/article/details/51945856