本地储存之 Cookie、webStorage、indexedDB
我们先来通过表格学习下这几种存储方式的区别
特性 |
Cookie |
localStorage |
sessionStorage |
indexedDB |
---|---|---|---|---|
数据声明周期 |
一般由服务器生成,可以设置过期时间 |
除非被清理,否在一直存在 |
页面关闭就清理 |
除非被清理,否在一直存在 |
数据储存大小 |
4k |
5M左右 |
5M左右 |
理论无限 |
与服务端通信 |
请求时会携带在 Http 的 header 中,对于请求性能稍有影响 |
不参与 |
不参与 |
不参与 |
#Cookie
主要用于存储一下用户相关的信息,如登录、权限、token 等,但是不宜过大,因为每次 http 请求都会带上,所以会稍微影响性能。 对于 cookie 来说,还需要注意一些安全性。
| 属性 | 作用 | | value | 如何用于保护用户登录态,应该将值加密 | | http-only | 不能通过 JS 访问 Cookie,减少 XSS 攻击 | | secure | 只能在协议为 HTTPS 的请求中携带 | | same-site | 规定浏览器不能再跨域请求中携带 Cookie,减少 CSRF 攻击 |
Cookie 的本职工作并非是本地存储,而是“维持状态”。 因为 HTTP 是一种无状态的协议,也就是说,客户端请求一次,服务端就响应一次,中间没有留下任何信息。 就像一个经常和你聊天的朋友,天南地北的都什么都聊,可每次你都不知道你们上一次聊得是什么,以及他叫什么名字。 那怎么办才能让他知道我是我呢? 这时候就需要 Cookie 了,Cookie 说白了就是一个存储在浏览器里的一个小小的文本文件,它附着在 HTTP 请求上,在浏览器和服务器之间“飞来飞去”。 它可以携带用户信息,当服务器检查 Cookie 的时候,便可以获取到客户端的状态,也就可以证明我是谁了。 Cookie 是以键值对的形式存储的。
#优点
- 后端设置
- 解决鉴权问题
#缺点
- 只有 4m,太小
- 过量的 Cookie 会带来巨大的性能浪费
- 不能跨域
#Web Storage
#localStorage
- 本地永久储存,除非手动清除,否在一直存在
- 大小:5M左右
- 用于储存稳定的资源:如 CSS、js、小图等。
#sessionStorage
- 页面回话存储,关闭页面自动清除。
- 大小:5M左右
- 用于临时的数据:如 token、个人信息、权限、购物车信息等
#使用
- 存储数据:setItem()
localStorage.setItem('user_name', 'xiuyan')
- 读取数据: getItem()
localStorage.getItem('user_name')
- 删除某一键名对应的数据: removeItem()
localStorage.removeItem('user_name')
- 清空数据记录:clear()
localStorage.clear()
#indexedDB
IndexedDB 是一个运行在浏览器上的非关系型数据库。既然是数据库了,那就不是 5M、10M 这样小打小闹级别了。
理论上来说,IndexedDB 是没有存储上限的(一般来说不会小于 250M)。它不仅可以存储字符串,还可以存储二进制数据。
本人用的也不是很多,具体用法可以参考:浏览器数据库 IndexedDB 入门教程
#PWA
PWA(Progressive web apps,渐进式 Web 应用)运用现代的 Web API 以及传统的渐进式增强策略来创建跨平台 Web 应用程序。
这些应用无处不在、功能丰富,使其具有与原生应用相同的用户体验优势。 这组文档和指南告诉您有关 PWA 的所有信息。
其实我的理解,就是在浏览器或者其他客户端应用缓存一个webapp,一次使用,就将代码都缓存到本地,再次打开无需重复加载。
是不是觉得很熟悉,这不就是微信小程序吗?
其实现在的微信小程序、快应用都算是一种 PWA 的实现。
比如:vuePress 就支持转PWA应用
参考:MDN-PWA
- Nginx权限提升漏洞(CVE-2016-1247 )分析
- 初识 Fuzzing 工具 WinAFL
- 如何使用Oozie API接口向Kerberos环境的CDH集群提交Spark2作业
- 如何编译及使用TPC-DS生成测试数据
- ASP.NET MVC编程——缓存
- ASP.NET MVC编程——错误处理与日记
- Jenkins 未授权远程代码执行漏洞(CVE-2017-1000353)
- ASP.NET MVC编程——路由
- ASP.NET MVC编程——模型
- ASP.NET MVC编程——验证、授权与安全
- 如何使用SAML配置CDSW的身份验证
- ASP.NET MVC编程——控制器
- ASP.NET MVC编程——视图
- 设计原则
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- rbind的坑?
- 全文检索工具Lucene入门教程
- 数据库技术:数据库连接池,Commons DbUtils,批处理,元数据
- elasticsearch-快速入门
- 数据库技术:JDBC,预处理对象,事务控制
- elasticsearch-DSL高级查询语法
- 数据库技术:XML
- 利用logstash将mysql多表数据增量同步到es
- 纯CSS实现自定义单选框和复选框
- 基于Linux安装Mysql5.7
- 纯CSS实现iOS风格打开关闭选择框
- 算法基础:递归
- ELK日志收集原理+es集群+elk搭建+本地目录文件读取,搭建分布式日志收集系统
- 什么是JavaScript 的闭包???
- es集群+elk搭建+kafka搭建分布式日志收集系统