Cookie
目的
Cookie诞生之初的作用就是解决HTTP的无状态请求,用来记录一些用户相关的一些状态。
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户行为等)
Cookie 本质上就是浏览器里面存储的一个很小的文本文件,内部以键值对的方式来存储(在chrome开发者面板的Application这一栏可以看到)。向同一个域名下发送请求,都会携带相同的 Cookie,服务器拿到 Cookie 进行解析,便能拿到客户端的状态。
缺点
h5之前,存储主要用cookies,缺点:
- 容量缺陷。大小限制4k。
- 性能缺陷。请求头上带着数据,导致流量增加。Cookie 紧跟域名,不管域名下面的某一个地址需不需要这个 Cookie ,请求都会携带上完整的 Cookie,这样随着请求数的增多,其实会造成巨大的性能浪费的,因为请求携带了很多不必要的内容。
- 安全缺陷。由于 Cookie 以纯文本的形式在浏览器和服务器中传递,很容易被非法用户截获,然后进行一系列的篡改,在 Cookie 的有效期内重新发送给服务器,这是相当危险的。另外,在HttpOnly为 false 的情况下,Cookie 信息能直接通过 JS 脚本来读取。
- 操作缺陷。Cookie的原生api不友好,需要自行封装
webStorage
HTML5 提供了两种在客户端存储数据的新方法:localStorage 和 sessionStorage,挂载在 window 对象下。 webStorage 是本地存储,数据不是由服务器请求传递的。从而它可以存储大量的数据,而不影响网站的性能
localStorage
以键值对(Key-Value)的方式存储,永久存储,永不失效,除非手动删除。IE8+支持,每个域名限制5M 打开同域的新页面也能访问得到。可以存储数组、数字、对象等可以被序列化为字符串的内容
js
window.localStorage.username = 'hehe' // 设置
window.localStorage.setItem('username', 'hehe') // 设置
window.localStorage.getItem('username') // 读取
window.localStorage.removeItem('username') // 删除
window.localStorage.key(1) // 读取索引为1的值
window.localStorage.clear()
sessionStorage
sessionStorage 在关闭页面后即被清空,而 localStorage 则会一直保存。很多时候数据只需要在用户浏览一组页面期间使用,关闭窗口后数据就可以丢弃了,这种情况使用 sessionStorage 就比较方便。 注意,刷新页面 sessionStorage 不会清除,但是打开同域新页面访问不到。
js
window.sessionStorage.username = 'hehe' // 设置
window.sessionStorage.setItem('username', 'hehe') // 设置
window.sessionStorage.getItem('username') // 读取
window.sessionStorage.removeItem('username') // 删除
window.sessionStorage.key(1) // 读取索引为1的值
window.sessionStorage.clear()
cookie | localStorage | sessionStorage | IndexedDB | Web SQL | |
---|---|---|---|---|---|
规范 | HTTP规范 | HTML5规范 | HTML5规范 | HTML5规范 | 已被W3C规范废弃,但浏览器广泛支持 |
挂载对象 | DOM | BOM | BOM | BOM | BOM |
传输 | cookie数据始终在同源的http请求中携带(即使不需要)仅在本地保存,不会传输 | 仅在本地保存,不会传输 | 仅在本地保存,不会传输 | 仅在本地保存,不会传输 | |
存储大小 | 4k | 5M左右,各浏览器的存储空间有差异 | 5M左右,各浏览器的存储空间有差异 | ||
有效期 | 在设置的cookie过期时间之前一直有效 | 始终有效,窗口或浏览器关闭也一直保存 | 仅在当前浏览器窗口关闭前有效 | 始终有效,窗口或浏览器关闭也一直保存 | 始终有效,窗口或浏览器关闭也一直保存 |
作用域 | 所有同源窗口中都是共享的 | 所有同源窗口中都是共享的 | 不在不同的浏览器页面中共享,即使是同一个页面 | 所有同源窗口中都是共享的 | 所有同源窗口中都是共享的 |
易用性 | 原生接口不友好,需要自己封装 | Web Storage 提供api 接口,易用 | Web Storage 提供api 接口,易用 | 提供了api 接口,易用 | 提供了api 接口,易用 |