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
}

} ```

Copyright © lujiannb@qq.com 2021 all right reserved,powered by Gitbook该文章修订时间: 2024-06-06 11:32:07

results matching ""

    No results matching ""