浅谈浏览器存储(cookie、localStorage、sessionStorage)
今天我们从前端的角度了解一下浏览器存储,我们常见且常用的存储方式主要由两种:cookie、webstorage(localstorage和sessionstorage)。下面我们来一一认识它们。
cookie基于http规范,用来识别用户。
cookie是服务器发送到浏览器的一小段数据,会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
cookie诞生之初的作用就是解决http的无状态请求,用来记录一些用户相关的一些状态。
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户行为等)
因为一些前端交互的需要,后来cookie也被用于存储一些客户端的数据。
cookie的原生api不友好,需要自行封装一下。下面是封装后的方法。
创建cookie
/** * @description js原生设置cookie * @param {string} name 给你要设置的cookie起个名字(key) * @param {string} value cookie的具体内容(value) * @param {string} expiredays 设置cookie的过期时间,单位:天 */ function setcookie(name, value, expiredays) { var exdate=new date(); exdate.setdate(exdate.getdate() + expiredays); document.cookie = name + '=' + escape(value)+ ((expiredays == null) ? '' : ';expires=' +exdate.togmtstring()); }
获取cookie
/** * @description js原生获取cookie方法1 * @param {string} name 你要获取的cookie名 */ function getcookie(name) { if (document.cookie.length > 0) { var start = document.cookie.indexof(name + '='); if (start !== -1) { start = start + name.length + 1; var end = document.cookie.indexof(';', start); if (end === -1) { end = document.cookie.length; return unescape(document.cookie.substring(start, end)); } } } return '';
}
/** * @description js原生获取cookie方法2 * @param {string} name 你要获取的cookie名 */ function getcookie(name) { var cookiearr = document.cookie.split(';') || []; if(!cookiearr.length){ return ''; } for(var i = 0; i < cookiearr.length; i ++){ var key = $.trim(cookiearr[i]).split('=')[0]; var value = $.trim(cookiearr[i]).split('=')[1]; if(key === name){ return value; } } }
检查cookie是否已存在
function checkcookie() { username = getcookie('username'); if (username !== null && username !== '') { alert('welcome again ' + username + '!'); } else { username = prompt('please enter your name:', ''); if (username !== null && username !== '') { setcookie('username',username,365); } } }
jquery.cookie.js封装的cookie设置方法:
创建cookie
/** * 'name', cookie命名 * 'value',cookie的值 * { * expires: 7, // cookie有效期,单位天;默认值:会话cookie,关闭浏览器cookie失效。 * path: '/', // cookie影响到的路径;值为'/',表示设置cookie在整个域中可用;默认值:创建cookie的页面路径。 * domain: 'example.com', // 定义cookie有效的域。默认值:创建cookie的页面域。 * secure: false, // 定义cookie安全性,默认值:false,设置为true,则cookie在http中是无效的,cookie的传输需要使用安全协议(https)。 * } */ $.cookie('name', 'value', { expires: 7, path: '/', domain: 'example.com', secure: false});
读取cookie
$.cookie('name'); //name存在返回对应value,不存在返回null
读取所有可用的cookies:
$.cookie(); //{'name': value}
todo:直接调用会报错?
删除cookie
//成功删除cookie时返回true,否则返回false $.removecookie('name'); // => true $.removecookie('nothing'); // => false
注意:删除cookie时,必须传递用于设置cookie的完全相同的路径,域和安全选项,除非您依赖于默认选项。 即:设置cookie时如果设置了path属性或secure属性,删除的时候要带着这些属性,否则无法成功删除cookie。 // this won't work! $.removecookie('name'); // => false // this will work! $.removecookie('name', { path: '/' }); // => true
todo:$.removecookie无效?
(jquery1.9.1.js + jquery.cookie.js,插件无重复引用的情况,$.removecookie提示undefined)
webstorage基于html5规范
html5 提供了两种在客户端存储数据的新方法:localstorage和sessionstorage,挂载在window对象下。
webstorage是本地存储,数据不是由服务器请求传递的。从而它可以存储大量的数据,而不影响网站的性能。
web storage的目的是为了克服由cookie带来的一些限制,当数据需要被严格控制在客户端上时,无须持续地将数据发回服务器。比如客户端需要保存的一些用户行为或数据,或从接口获取的一些短期内不会更新的数据,我们就可以利用web storage来存储。
localstorage的生命周期是永久性的。localstorage存储的数据,即使关闭浏览器,也不会让数据消失,除非主动的去删除数据。如果 想设置失效时间,需自行封装。
sessionstorage 的生命周期是在浏览器关闭前。
特性:
- 关闭浏览器sessionstorage 失效;
- 页面刷新不会消除数据;
- 只有在当前页面打开的链接,才可以访sessionstorage的数据,使用window.open打开页面和改变localtion.href方式都可以获 取到sessionstorage内部的数据;
总结:
存储方式 |
作用与特性 |
存储数量及大小 |
api |
cookie |
● 存储用户信息,获取数据需要与服务器建立连接。 ● 可存储的数据有限,且依赖于服务器,无需请求服务器的数据尽量不要存放在cookie中,以免影响页面性能。 ● 可设置过期时间。 |
● 最好将cookie控制在4095b以内,超出的数据会被忽略。 ● ie6或更低版本最多存20个cookie; ie7及以上版本最多可以有50个;firefox最多50个;chrome和safari没有做硬性限制。 |
原生、$.cookie(详见上文) |
localstorage |
● 存储客户端信息,无需请求服务器。 ● 数据永久保存,除非用户手动清理客户端缓存。 ● 开发者可自行封装一个方法,设置失效时间。
|
5m左右,各浏览器的存储空间有差异。(感兴趣的同学可以自己试一下)。 |
// 保存数据到 localstorage localstorage.setitem('key', 'value'); // 从 localstorage 获取数据 let data = localstorage.getitem('key'); // 从 localstorage 删除保存的数据 localstorage.removeitem('key'); // 从 localstorage 删除所有保存的数据 localstorage.clear(); |
sessionstorage |
● 存储客户端信息,无需请求服务器。 ● 数据保存在当前会话,刷新页面数据不会被清除,结束会话(关闭浏览器、关闭页面、跳转页面)数据失效。
|
同localstorage |
// 保存数据到 sessionstorage sessionstorage.setitem('key', 'value'); // 从 sessionstorage 获取数据 let data = sessionstorage.getitem('key'); // 从 sessionstorage 删除保存的数据 sessionstorage.removeitem('key'); // 从 sessionstorage 删除所有保存的数据 sessionstorage.clear(); |
参考文档:
cookie api
https://developer.mozilla.org/en-us/docs/web/http/cookies
http://www.w3school.com.cn/js/js_cookies.asp
https://github.com/carhartl/jquery-cookie#readme
webstorage
http://www.w3school.com.cn/html5/html_5_webstorage.asp
https://developer.mozilla.org/zh-cn/docs/web/api/web_storage_api
推荐阅读
-
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
-
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
-
HTMl5的存储方式sessionStorage和localStorage详解
-
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
-
sessionStorage 、localStorage 和 cookie 之间的区别详解
-
本地存储常用方式 localStorage, sessionStorage,cookie 的区别 和 服务器存储session
-
localStorage&sessionStorage&Cookie
-
Cookie、LocalStorage 与 SessionStorage的区别在哪里?
-
cookie解决微信不能存储localStorage的问题
-
浅谈浏览器存储(cookie、localStorage、sessionStorage)