• # Cookie"># Cookie
  • # localStorage"># localStorage
  • # sessionStorage"># sessionStorage

    浏览器的本地存储主要分为Cookie和WebStorage和IndexDB,而WebStorage又可以分为LocalStorage和sessionStorage

    # Cookie

    Cookie最开始的时候不是用来做本地存储的,而是为弥补HTTP在状态管理上的不足
    HTTP协议是一个无状态协议,客户端向服务端发送请求,服务器返回响应,但是如何让服务端记住下次发送请求时客户端是谁?那么久产生了Cookie
    Cookie本质上是浏览器内部存储的一个很小的文本文件,内部是以键值对的方式在存储.在同一个域名发送请求时,都会携带相同的cookie,服务器进行解析,就可以拿到客户端的状态了

    那么Cookie的作用就是用来做浏览器的状态存储的,所以有一些缺陷

    • 容量缺陷:Cookie的体积上限只有4KB,只能用来存储少量的信息
    • 性能缺陷:Cookie紧跟域名,所以不管地址需要不需要都会携带Cookie,这样随着请求量增多时,就会造成巨大的性能浪费,因为有很多不必要的内容
    • 安全缺陷:由于Cookie是以纯文本的形式在浏览器和服务器之间传递,很容易被截取,然后在Cookie的有效期内重新发送个服务器,另外,在HttpOnly为 false 的情况下,Cookie 信息能直接通过 JS 脚本来读取。可以用cookie 字段带上HttpOnly,那么说明只能通过 HTTP 协议传输,不能通过 JS 访问,这也是预防 XSS 攻击的重要手段。

    # localStorage

    相同点:针对一个域名,就是在同一个域名下,会存储相同一段的localstorage
    区别

    • 容量:localstorage的容量5M,持久存储
    • 只存在客户端,默认不参与与服务端通信,这样就很好地避免了 Cookie 带来的性能问题安全问题
    • 接口封装。通过localStorage暴露在全局,并通过它的 setItemgetItem等方法进行操作,非常方便。

    localStorage的使用

    1. let obj = { name: "sanyuan", age: 18 };
    2. localStorage.setItem("name", "sanyuan");
    3. localStorage.setItem("info", JSON.stringify(obj));
    4. //接着进入相同的域名时就能拿到相应的值:
    5. let name = localStorage.getItem("name");
    6. let info = JSON.parse(localStorage.getItem("info"));
    7. //从这里可以看出,localStorage其实存储的都是字符串,如果是存储对象需要调用JSON的stringify方法,并且用JSON.parse来解析成对象。

    # sessionStorage

    sessionStorage以下方面和localStorage一致:

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

    sessionStoragelocalStorage有一个本质的区别,那就是前者只是会话级别的存储,并不是持久化存储。会话结束,也就是页面关闭,这部分sessionStorage就不复存在了。