为localStorage设置过期时间,关闭浏览器清空localStorage

5 篇文章 0 订阅
1 篇文章 0 订阅

我们知道localStorage是会一直保存在浏览器里面的,除非人为清除,否则会一直记录,但有些情况下我们只想让它保留几天时间,所以这次我们为localStorage设置一个过期时间.
简单的说就是让它存进去的时候保留一个存入时间,获取的时候让当前时间与存入时间对比一下,看是否过期,过期了就清除这个localStorage

现在根据需求封装一个Storage

class Storage {
    constructor(name) {
        this.name = 'storage';
    }
    //设置缓存
    setItem(key, value, expires) {
        let obj = {
            key: key, // key
            value: value, // 存入的值
            expires: expires,//过期时间 毫秒
            startTime: new Date().getTime()//记录何时将值存入缓存,毫秒级
        }
        if (expires) {
        // 存在过期时间
            localStorage.setItem(key, JSON.stringify(obj));
        } else {
            //判断value是否是对象 如果是对象 就转为字符串存入 否则直接存入
            let type = Object.prototype.toString.call(value);
            if (type == '[object Object]') {
                value = JSON.stringify(value);
            }
            if (type == '[object Array]') {
                value = JSON.stringify(value);
            }
            localStorage.setItem(key, value);
        }
    }
    //获取localStorage
    getItem(name) {
        let item = localStorage.getItem(name);
        //先将拿到的试着进行json转为对象的形式
        try {
            item = JSON.parse(item);
        } catch (error) {
            //如果不行就不是json的字符串,就直接返回
            item = item;
        }
        if(!item){
            return null
        }
        //如果有startTime的值,说明设置了失效时间
        if (item.startTime) {
            let date = new Date().getTime();
            //何时将值取出减去刚存入的时间,与item.expires比较,如果大于就是过期了,如果小于或等于就还没过期
            if (date - item.startTime > item.expires) {
                //缓存过期,清除缓存,返回false
                localStorage.removeItem(name);
                return false;
            } else {
                //缓存未过期,返回值
                return item.value;
            }
        } else {
            //如果没有设置失效时间,直接返回值
            return item;
        }
    }
    //移出缓存
    removeItem(name) {
        localStorage.removeItem(name);
    }
    //移出全部缓存
    clear() {
        localStorage.clear();
    }
}
export default new Storage();
// Storage.setItem("is_root", is_root, expires);

关闭浏览器时清空localStorage

之前看了很多关于怎么区别浏览器关闭\刷新事件等等的文章,感觉很复杂效果也不好,最后还是用了sessionStorage来做为判断,因为sessionStorage会随着页面的关闭而清空的,所以我们可以在入口文件这里监听一下sessionStorage是否存在,不存在就直接清空localstorage.
但是这个弊端就是不能在两个标签页展示页面,因为另外一个标签页打开就是另一个会话了

// main.js
// 在登录页面 把token存入localStorage里面时 再存一个isClear在seesionStorage里
// 如果用户不需要保存信息 那么就判断sessionStorage.getItem('isClear')是否存在 不存在就清空
if (!sessionStorage.getItem('isClear') && !Storage.getItem("isSaveloginInfo")) {
    Storage.clear()
}
页面跳转会导致localStorage中的数据被清空。这是因为localStorage是基于域名的,不同页面之间的localStorage是相互隔离的。当页面跳转时,浏览器会加载新的页面,旧页面的localStorage数据会被清空,新页面会重新创建一个空的localStorage对象。 如果需要在页面跳转后保留localStorage中的数据,可以使用以下方法之一: 1. 使用sessionStorage:sessionStorage也是浏览器提供的一种存储数据的方式,与localStorage类似,但是它的生命周期是在当前会话期间,当会话结束或关闭浏览器时,sessionStorage中的数据会被清空。可以使用sessionStorage来存储需要在页面跳转后保留的数据。 2. 使用cookie:cookie是一种在浏览器端存储数据的机制,可以设置cookie的过期时间,当页面跳转后,可以通过读取cookie来获取之前存储的数据。需要注意的是,cookie有大小限制,一般为4KB左右。 3. 使用URL参数:可以将需要保留的数据作为URL参数传递给下一个页面,在下一个页面中通过解析URL参数来获取数据。这种方式适用于数据量较小的情况。 4. 使用服务器端存储:将需要保留的数据存储在服务器端,通过在页面跳转后再次请求服务器来获取数据。这种方式适用于数据量较大或需要长期保存的情况。 请注意,以上方法都有各自的适用场景和限制条件,需要根据具体需求选择合适的方法来保留数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值