网络基础03 Web Storage
Web Storage知识总结。
[TOC]
Web Storage
基础概念
WebStorage分为localStorage和sessionStorage。
浏览器支持情况:(基本IE7以上都可以使用)
有如下的方法:
localStorage.setItem("a", "b")
:为本地存储键值对,等同于localStorage['a'] = b
localStorage.getItem("a")
:获取属性名a对应的属性值,等同于localStorage['a']
localStorage.clear()
:删除所有值localStorage.removeItem("a")
:删除指定的键值对localStorage.key(1)
:获取指定位置的属性名
WebStorage都要受到同源策略的限制。
存值类型
目前所有的浏览器中都会把WebStorage的值类型限定为string
类型:
1 | window.localStorage.setItem('a', 3); |
直接向WebStorage中存入对象是不行的:
1 | let a = { name: 'joe' } |
存入对象的时候,需要使用JSON.stringify()
这个方法,将对象序列化,读取时要将字符串反序列化,使用JSON.parse()
方法
1 | var data = { |
localStorage和sessionStorage的区别
LocalStorage与SessionStorage有两个比较明显的区别点:
(1)localStorage属于永久性存储,而sessionStorage存储的值会在会话结束的时候(当前标签页关闭)被清空
(2)localStorage可以在同源策略的基础上,不同的浏览器标签页之间共享,而sessionStorage的生命周期是于当前Tab相同的,不能在不同的标签页间共享
监听WebStorage事件
当localStorage或sessionStorage被修改时,会触发StorageEvent
事件,我们可以通过监听storage
来捕获这个事件:
1 | window.addEventListener('storage', (e) => { |
要注意:事件在同一个域下面的不同的页面之间才会被触发,即在A页面注册了storage
的监听,只有在A同域名下的B页面操作Storage对象,A页面才会被触发storage事件。在A页面本身修改Storage对象是不会触发此事件的。
Cookie与WebStorage的区别
(1)Cookie参与网络通信,可以随着HTTP请求的头部信息发送到服务器,WebStorage不参与网络通信,只在本地储存信息
(2)Cookie容量较小,一般为4KB左右,WebStorage容量较大,为5M左右
(3)Cookie可以指定生效时间,过期后失效,LocalStorage除非被主动清除,否则永久有效,SessionStorage仅在本次会话有效,在浏览器关闭后失效,如果要为WebStorage设定有效期需要自己进行封装
(4)Cookie跨域传递的方法是在客户端与服务器通信的方案(CORS/方向代理/JSONP等),而WebStorage的跨域传递是多个客户端之间进行(postMessage
)
关于WebStorage的几个问题
(1)a.baidu.com
和b.baidu.com
能共享同一个localStorage吗?
不能,因为本地存储都要受到同源策略的限制,也就是说只要是符合跨域的情况都不能互访本地存储。主域名、二级域名、端口号、协议不同,都属于跨域。如果希望共享,可以使用
postMessage
方法
(2)浏览器打开的不同Tab之间能否共享localStorage?
只要符合同源策略的限制就可以,但是sessionStorage不可以
(3)如果localStorage满了,再继续往里存东西,会发生什么?
存不进去并且报错QuotaExceededError