Cookie 与 Storage 的区别与用法
cookie
cookie非常小,它的大小限制为4KB左右。它的主要用途有保存登录信息,比如你登录某个网站市场可以看到“记住密码”,这通常就是通过在 Cookie 中存入一段辨别用户身份的数据来实现的。
localStorage
localStorage的生命周期是永久性的。假若使用localStorage存储数据,即使关闭浏览器,也不会让数据消失,除非主动的去删除数据,localStorage有length属性,可以查看其有多少条记录的数据。
sessionStorage
sessionStorage 的生命周期是在浏览器关闭前。也就是说,在整个浏览器未关闭前,其数据一直都是存在的。sessionStorage也有length属性,其基本的判断和使用方法和localStorage的使用是一致的。
三者的异同
特性|cookie|localStorage|sessionStorage :---:|:---:|:---:|:---: 数据的生命期|一般由服务器生成,可设置失效时间。如果在浏览器端生成Cookie,默认是关闭浏览器后失效|除非被清除,否则永久保存|仅在当前会话下有效,关闭页面或浏览器后被清除 存放数据大小|4K左右|一般为5MB|一般为5MB 与服务器端通信|每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题|仅在客户端(即浏览器)中保存,不参与和服务器的通信|仅在客户端(即浏览器)中保存,不参与和服务器的通信 易用性|需要程序员自己封装,源生的Cookie接口不友好|源生接口可以接受,亦可再次封装来对Object和Array有更好的支持|源生接口可以接受,亦可再次封装来对Object和Array有更好的支持
cookie 的封装
const cookie = {
get: function(key) {
if (document.cookie) { //判断是否有cookie
var arr = document.cookie.split('; '); //拆分cookie
for (var i = 0; i < arr.length; i++) {
var item = arr[i].split('='); //将key和value进行拆分
if (item[0] === key) { //如果 key === 用户传入的key 则返回对应的value
return item[1];
}
}
return ''; //遍历结束没有找到 则返回空字符串
}
},
set: function(key, value, day) {
if (day) {
var d = new Date();
d.setDate(d.getDate() + day);
document.cookie = `${key}=${value};expires=${d};path=/`;
} else {
document.cookie = `${key}=${value};path=/`;
}
},
remove: function(key) {
this.set(key, "", -1);
}
}
vue 中使用 vue-cookies 插件对 cookie 进行封装
// 运行 npm i vue-cookies -S // 安装插件 import vueCookie from 'vue-cookies' vueCookie.config(60 60 24 * 3) // 设置cookie const CK = { // 设置key set: (keyName, value, expireTimes) => { return vueCookie.set(keyName, value, expireTimes) // this }, // 获取key get: (keyName) => { return vueCookie.get(keyName) // value }, // 删除key remove: (keyName) => { return vueCookie.remove(keyName) // true、false }, // 是否存在key isKey: (keyName) => { return vueCookie.isKey(keyName) // true、false }, // 获取所有key keys: () => { return vueCookie.keys() // array } }
localStorage 的封装
class Storage { constructor(props) { this.props = props || {} this.source = this.props.source || window.localStorage this.initRun() } initRun() { const reg = new RegExp('expires') let data = this.source let list = Object.keys(data) if (list.length > 0) { list.map((key, v) => { if (!reg.test(key)) { let now = Date.now() let expires = data[${key}__expires__] || Date.now + 1 if (now >= expires) { this.remove(key) } } return key }) } } /** * @description 获取方法 * @param {String} key 键 * @returns value * @memberof Storage */ get(key) { const source = this.source const expired = source[`${key}__expires__`] || Date.now + 1 const now = Date.now() if (now >= expired) { this.remove(key) return } let value = source[key] if (/^\{.*\}$/.test(value) || /^\[.*\]$/.test(value)) value = JSON.parse(value) return value } /** * @description 存储方法 * @param {String} key 键 * @param {String} value 值 * @param {Number} expired 过期时间,单位分钟,非必填 * @returns value * @memberof Storage */ set(key, value, expired) { if (typeof value === typeof {}) value = JSON.stringify(value) let source = this.source source[key] = value if (expired) { source[`${key}__expires__`] = Date.now() + 1000 * 60 * expired } return value } /** * @description 删除方法 * @param {String} key 键 * @returns value * @memberof Storage */ remove(key) { const data = this.source const value = data[key] delete data[key] delete data[`${key}__expires__`] return value } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论