您的位置:首页 > 其它

Cookie/Session/Local Storage/IndexedDB

2017-02-08 09:21 351 查看
本文主要总结客户端/浏览器端数据存储的技术。

在客户端或者浏览器端存储,可以快速的访问页面,当前主要有Cookie,Session,Local Storage,IndexedDB四种(WebSQL呗废弃)

Cookie

cookie实际就是一小段文本信息,意为“甜饼”,客户端发送请求到服务端,如果服务端要记录该用户某些状态信息,就将一段信息(即Cookie)response给客户端,客户端浏览器就会存起来;当客户端再次请求时会将Cookie一起请求给服务端,服务端根据Cookie识别出找个客户,并可以做一些Cookie的更改。

//可以通过document.cookie获取Cookie信息
//create
document.cookie = "name=yyf";
document.cookie = "age=17";

console.log(document.cookie);
//update
document.cookie = "name=yyfer";
console.log(document.cookie);

//delete
var exp = new Date();
exp.setTime(exp.getTime()-1);
document.cookie = "name=cvals;expires="+exp.toGMTString();
console.log(document.cookie);

//cookie需要浏览器的支持,如果浏览器禁用cookie,则无法使用cookie
//不同的浏览器存储cookie的方式不一样
//IE会将Cookie存储在C:Document and Setting\你的用户名\Cookie文件夹下的文本文件下
//cookie不具备跨域名性,两个二级域名算是不同的域名,所以Cookie是区分开的,两个域名间不能操作彼此的Cookie
//中文是Unicode编码,在内存占四个字符,英文是ASCII字符,Cookie如果保存中文,需要进行编码,一般是使用UTF-8进行编码,不推荐使用GBK等中文编码,因为浏览器不一定支持且JavaScript也不支持GBK编码
//Cookie也可以使二进制数据,如在Cookie中使用数字证书提高安全度,使用二进制数据时也需要进行编码
//Cookie的大小有限制的,所以,Cookie内容不必过多,否则会影响速度

//Cookie的属性
//除了name和value之外,还有其他常用的属性,每个属性都有一个getter和setter方法
//name,String类型,Cookie的名称,Cookie一旦创建,名称不能更改
//value,object类型,如果是Unicode字符,则为字符编码,如果是二进制数据,则需要base64编码
//maxAge,int类型,Cookie的实效时间,单位为秒,如果为负数表示Cookie为临时Cookie且关闭浏览器就会失效,浏览器也不会保存该Cookie,如果为0,表示删除该Cookie,默认为-1
//secure,bool类型,默认为false,指该Cookie是否被使用安全协议传输,安全协议有Https,SSL等,在网络上传输数据之前先将数据加密
//path,string类型,最后一个字符为'/',指Cookie的使用路径,如果设置为'/session/',则只有contextPath为'/session'的程序可以访问该Cookie,如果设置为'/',则域名下都可以访问该Cookie
//domain,string类型,第一个字符为'.',如果设置为'.baidu.com',则所有以'baidu.com'结尾的域名都可以访问该Cookie
//comment,string类型, 备注说明
//version,int类型,0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范

//http是无状态的,而且是不安全的,使用http协议的数据不经过任何加密就直接在网路上传输,有被截获的可能,使用http协议是有隐患的.所以使用secure属性设置使用安全协议传输,secure属性不会对数据进行加密,需要在程序中对数据加密处理在进行传输
//
//因为JavaScript可以通过document.cookie获取cookie信息,会导致隐患,所以W3C组织规定,W3C标准的浏览器不允许访问不属于自己网站的cookie

//永久登录
//首次登录保存账号和加密后的密码到cookie,下次登录验证输入的账号和密码与cookie中的对比,所以只要保证加密方法不可逆,就不可能解密获得真实的密码


Cookie优点

1 能跟服务端进行通信

2 当Cookie快过期,可以重新设置而不是删除

Cookie缺点

1 增加了文档传输的负载

2 只能存储少量的数据

3 只能存储字符串

4 安全问题

5 有了Session/Local Storage之后, 不再推荐使用Cookie来存储数据

Local Storage

//是Web Storage API的一种类型,能在浏览器端存储键值对数据
//因为提供更安全和直观的API来存储数据,所以作为替代Cookie的一种解决方案
//尽管Local storage只能存储字符串,但是也可以存储字符串化的JSON数据,这就表明Local Storage能比Cookie存储更复杂的数据

//创建Local Storage数据
const user = {name:'yyf',age:'25'};
localStorage.setItem('user',JSON.stringify(user));

//读取Local Storage数据
console.log(JSON.parse(localStorage.getItem('user')));
//Object {name: "yyf", age: "25"}

//更新Local Storage对象
const new_user = {name:'yyfer',age:'26'};
localStorage.setItem('user',JSON.stringify(new_user));
console.log(JSON.parse(localStorage.getItem('user')));
//Object {name: "yyfer", age: "26"}

//删除Local Storage对象
localStorage.removeItem('user');
console.log(JSON.parse(localStorage.getItem('user')));
//null

//Local Storage优点(相比于Cookie)
//提供了更直观的接口来存储数据
//比Cookie更加安全
//能存储更多的数据
//Local Storage缺点
//只能存储字符串数据


Session Storage

//Session Storage
//一般称为Session,是Web Storage API的另外一种
//和Local Storage类似, 区别是Session只存储当前会话(tab页)的数据
//一旦关闭浏览器或者当前页,数据会被自动清理掉

//创建Session Storage数据
const user = {name:'yyf',age:'25'};
sessionStorage.setItem('user',JSON.stringify(user));

//读取Session Storage数据
console.log(JSON.parse(sessionStorage.getItem('user')));
//Object {name: "yyf", age: "25"}

//更新Session Storage对象
const new_user = {name:'yyfer',age:'26'};
sessionStorage.setItem('user',JSON.stringify(new_user));
console.log(JSON.parse(sessionStorage.getItem('user')));
//Object {name: "yyfer", age: "26"}

//删除Session Storage对象
sessionStorage.removeItem('user');
console.log(JSON.parse(sessionStorage.getItem('user')));
//null

//优缺点同Local Storage一样

//相比cookie,Session是存储在服务端,当然也增加了服务端的存储压力
//session是服务端使用的一种记录客户端状态的机制

//客户端浏览器访问服务端的时候,服务端将客户端信息以某种形式存储在服务器上
//当客户端再次访问的时候,从服务端查找该客户的信息就行了

//session也是键值对的形式存储的
//session是根据客户区分的,不同客户间的数据信息不能被其他客户访问

//当客户访问量较大时,会造成服务端内存溢出,因此session也必须精简

//session不能根据http链接来判断是同一个客户,
//因此服务端向客户端发生一个JSESSIONID的cookie,
//这个值为session的id,session通过这个cookie来判断是同一个客户,
//该cookie是服务器自动生成的,它的maxAge=-1,

//右键新窗口打开,子窗口可以使用父窗口的session

//url重定向, 解决客户端浏览器不支持cookie
//原理是将该用户的id信息重写到url中,当再次访问时,服务端会解析url中的id信息,这样即使浏览器不支持cookie,也可以使用session来记录用户信息


Indexed DB

//Indexed DB
//Indexed DB是一种更为复杂和全面地客户端数据存储方案,它是基于JavaScript,面向对象和数据库的,能非常容易地存储数据和检索已建立关键字索引的数据

//使用IndexedDB在浏览器端存储数据比其他方法更复杂, 在进行增删改查的操作,都需要先打开数据库,
//IndexedDB能够处理更复杂和结构化的数据,拥有更大的存储空间,有更多的交互限制,但是比Web Storage API更难应用
//待续....


对比CookieLocal StorageSession StorageIndexed DB
存储限制4Kb5M5M硬盘的一半
数据永久yes  yesnoyes
数据类型stringstringstringany type
索引性no nonoyes
感谢:

https://github.com/dwqs/blog/issues/42

http://blog.csdn.net/fangaoxin/article/details/6952954/

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: