浏览器的本地存储主要分为cookieWebstorage还有IndexDB,其中WebStorage又可以分为localStoragesessionStorage

关键词:

1.捆绑域名

2.容量只有4kb ——>容量缺陷

3.不管需不需要都会在请求中携带,产生冗余 ——>性能缺陷

4.纯文本,在客户端和服务器中传递,易被读取修改 ——>安全缺陷

Cookie 最开始被设计出来其实并不是来做本地存储的,而是为了弥补HTTP状态管理上的不足

HTTP 协议是一个无状态协议,客户端向服务器发请求,服务器返回响应,故事就这样结束了,但是下次发请求如何让服务端知道客户端是谁呢?

这种背景下,就产生了 Cookie.

Cookie 本质上就是浏览器里面存储的一个很小的文本文件,内部以键值对的方式来存储(在chrome开发者面板的Application这一栏可以看到)。向同一个域名下发送请求,都会携带相同的 Cookie,服务器拿到 Cookie 进行解析,便能拿到客户端的状态。

Cookie 的作用很好理解,就是用来做状态存储的,但它也是有诸多致命的缺陷的:

  1. 容量缺陷。Cookie 的体积上限只有4KB,只能用来存储少量的信息。
  2. 性能缺陷。Cookie 紧跟域名,不管域名下面的某一个地址需不需要这个 Cookie ,请求都会携带上完整的 Cookie,这样随着请求数的增多,其实会造成巨大的性能浪费的,因为请求携带了很多不必要的内容。
  3. 安全缺陷。由于 Cookie 以纯文本的形式在浏览器和服务器中传递,很容易被非法用户截获,然后进行一系列的篡改,在 Cookie 的有效期内重新发送给服务器,这是相当危险的。另外,在HttpOnly为 false 的情况下,Cookie 信息能直接通过 JS 脚本来读取

WebStorage

包括localstoragesessionstorage,都只存储在客户端,不参与服务端的传递,容量上限都是5m,接口都暴露在全局,都可以进行操作

localStorage

关键词:
  1. 捆绑域名
  2. 容量为5M,LocalStorage是对域名持久存储的,不同于cookie是针对请求的
  3. 接口暴露在全局,可以通过setItemgetItem等方法进行操作。
  4. 只存在于客户端不参与与服务器的通信,避免的安全问题
和Cookie异同

localStorage有一点跟Cookie一样,就是针对一个域名,即在同一个域名下,会存储相同的一段localStorage

不过它相对Cookie还是有相当多的区别的:

  1. 容量。localStorage 的容量上限为5M,相比于Cookie的 4K 大大增加。当然这个 5M 是针对一个域名的,因此对于一个域名是持久存储的。
  2. 只存在客户端,默认不参与与服务端的通信。这样就很好地避免了 Cookie 带来的性能问题安全问题
  3. 接口封装。通过localStorage暴露在全局,并通过它的 setItemgetItem等方法进行操作,非常方便。
操作方式

接下来我们来具体看看如何来操作localStorage

let obj = { name: "sanyuan", age: 18 };
localStorage.setItem("name", "sanyuan"); 
localStorage.setItem("info", JSON.stringify(obj));

接着进入相同的域名时就能拿到相应的值:

let name = localStorage.getItem("name");
let info = JSON.parse(localStorage.getItem("info"));

从这里可以看出,localStorage其实存储的都是字符串,如果是存储对象需要调用JSONstringify方法,并且用JSON.parse来解析成对象。

应用场景

利用localStorage的较大容量和持久特性,可以利用localStorage存储一些内容稳定的资源,比如官网的logo,存储Base64格式的图片资源,因此利用localStorage

sessionStorage

关键词:
  1. 相同于localstorage,只存在于客户端
  2. 不同与localstorage,只存在于会话阶段,关闭页面或者浏览器后被清除。而不是持久存储
特点

sessionStorage以下方面和localStorage一致:

  • 容量。容量上限也为 5M。
  • 只存在客户端,默认不参与与服务端的通信。
  • 接口封装。除了sessionStorage名字有所变化,存储方式、操作方式均和localStorage一样。

sessionStoragelocalStorage有一个本质的区别,那就是sessionStorage只是会话级别的存储,并不是持久化存储。会话结束,也就是页面关闭,这部分sessionStorage就不复存在了。(我是通过类比于JS的执行期上下文来理解的,只存在于函数执行的时候,函数执行结束,就断开映射)

应用场景
  1. 可以用它对表单信息进行维护,将表单信息存储在里面,可以保证页面即使刷新也不会让之前的表单信息丢失。
  2. 可以用它存储本次浏览记录。如果关闭页面后不需要这些记录,用sessionStorage就再合适不过了。事实上微博就采取了这样的存储方式。