一文梳理Web存储,从cookie,WebStorage到IndexedDB (2)

不够安全,服务器没法分辨用户和攻击者,攻击者可以读取网络上的其他用户的信息,包含HTTP Cookie的全部内容,以便进行中间的攻击。使用跨站点脚本技术可以窃取cookie等。

Web Storage

Internet Explorer 8+, Firefox, Opera, Chrome, 和 Safari支持Web 存储。

Web Storage 是 HTML5 专门为浏览器存储而提供的数据存储机制。它又分为 Local Storage 与 Session Storage。localStorage与sessionStorage保存的数据,以“键值对”的形式存在,并都是以文本格式保存。

localStorage与sessionStorage的区别

两者的区别在于生命周期作用域的不同。

生命周期: Local Storage 是持久化的本地存储,存储在其中的数据永远不会过期,只能是手动删除。Session Storage 是临时性的本地存储,它是会话级别的存储,当会话结束(页面被关闭)时,存储内容也随之被释放。

作用域:Local Storage、Session Storage 和 Cookie 都遵循同源策略。但 Session Storage 在遵循同源策略的前提下,还需要在同一窗口。只要它们不在同一个浏览器窗口中打开,那么它们的 Session Storage 内容便无法共享。

一文梳理Web存储,从cookie,WebStorage到IndexedDB

方法

不管是 localStorage,还是 sessionStorage,可使用的API都相同。以localStorage为例:

保存数据:localStorage.setItem(key,value);

读取数据:localStorage.getItem(key);

删除单个数据:localStorage.removeItem(key);

删除所有数据:localStorage.clear();

得到某个索引的key:localStorage.key(index);

module.exports = { set:set, get:get, remove:remove, removeAll:removeAll, each:each } function set(key ,val){ localStorage.setItem(key, JSON.stringify(val)); }; function get(key){ return JSON.parse(localStorage.getItem(key)); }; function remove(key){ localStorage.removeItem(key); }; function removeAll(){ localStorage.clear(); }; function each(fn){ pluck(localStorage, function(val, key){ fn(val, key); return false; }); } function pluck(obj, fn){ if(isList(obj)) { for(var i = 0; i<obj.length;i++){ if(fn(obj[i], i)) { return obj[i]; } } } else { for(var key in obj) { if(obj.hasOwnProperty(key)){ if(fn(obj[key], key)){ return obj[key]; } } } } } function isList(val) { return (val != null && typeof val != 'function' && typeof val.length == 'number') } function isFunction(val) { return val && Object.prototype.toString.call(val) === '[object Function]' } function isObject(val) { return val && Object.prototype.toString.call(val) === '[object Object]' } Web Storage 特点

存储容量大: Web Storage 根据浏览器的不同,存储容量可以达到 5-10M 之间。Chrome、FireFox、Edge 都是 5M(IE 忽略)。

仅位于浏览器端,不与服务端发生通信。

应用场景

localStorage:

缓存静态资源,比如图片内容丰富的电商网站会用它来存储 Base64 格式的图片字符串或者存储一些不经常更新的 CSS、JS 等静态资源。

作为前端 DB 的存储介质

sessionStorage:

用来存储生命周期和它同步的会话级别的信息。比如存储用户输入的内容,当页面刷新的时候可以立刻显示出刷新前的内容

IndexedDB

IndexedDB 是一个运行在浏览器上的非关系型数据库。理论上来说,IndexedDB 是没有存储上限的(一般来说不会小于 250M)。它不仅可以存储字符串,还可以存储二进制数据。

IndexedDB特点

键值对储存,IndexedDB 内部采用对象仓库(object store)存放数据。

异步,ndexedDB 操作时不会锁死浏览器,用户依然可以进行其他操作(与 LocalStorage 形成对比,后者的操作是同步的)。

支持事务,只要有一步失败,整个事务就都取消,数据库回滚到事务发生之前的状态,不存在只改写一部分数据的情况。

同源限制,每一个数据库对应创建它的域名。网页只能访问自身域名下的数据库,而不能访问跨域的数据库。

存储空间大,一般来说不少于 250MB,甚至没有上限。

支持二进制储存,仅可以储存字符串,还可以储存二进制数据(ArrayBuffer 对象和 Blob 对象)。

常见操作

IndexedDB大部分操作并不是常用的调用方法,返回结果的模式,而是请求——响应的模式。

建立打开IndexedDB ----window.indexedDB.open("testDB")

关闭IndexedDB----indexdb.close()

删除IndexedDB----indexedDB.deleteDatabase(indexdb)

应用场景

在 IndexedDB 中,我们可以创建多个数据库,一个数据库中创建多张表,一张表中存储多条数据——这足以 hold 住复杂的结构性数据。

不需要网络连接的离线纯应用,比如Todolist这类用来记录待办任务类型的应用。

需要存储大量数据的应用,比如图书馆管理系统这类存储大量数据的应用;

配合service work构建pwa应用,用于缓存网络请求。

cookie/webStorage/IndexedDB区别

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyxjx.html