一文教你如何实现localStorage的过期机制

目录
  • 前言
  • cookie过期机制
    • expires和max-age的区别
  • localStorage数据过期
    • 需求分析:
    • 动手实践
  • 参考文章
  • 总结

前言

我们都知道cookie存储的数据是可以添加过期时间属性(Expires/Max-Age),实现过期的。 那么,LocalStrorage、sessionStrorage可以设置过期吗??

带着这样的疑问,我们一层层剥开其神秘的面纱。

cookie过期机制

我们知道Expires和Max-age都可以设置cookie的过期时间,那么两者存在什么样的异同点呢?

expires和max-age的区别

Expires 设置的是绝对值,即直接设置当前cookie在什么时候过期。 就像下面图中的这样, GMT格式。

  • Expires在HTTP/1.0中已经定义
  • max-age在HTTP/1.1中才有定义,为了向下兼容,仅使用max-age不够;

Expires 设置一个绝对值,至少会带来两个方面的问题:

  • 客户端和服务端时间不同步的问题。往往表现为时区不同、客户端时间可被用户自由修改。
  • 很容易在配置后忘记具体的过期时间,导致过期来临出现浪涌现象(我的理解应该是同时大批量更新的问题)。

Max-Age代表存活时间,记录的是一个相对时间(例如 6000s),起始时间点是服务器记录的requet-time。

我们看到除了上面提到的两个值,还有 session, 这个值代表的意思就是在当前连接下,关闭浏览器窗口、断开与服务连接,该数据即失效。

localStorage 数据过期

localstorage本身是没有过期机制的,不过我们可以通过其他手段来扩展,使其能够满足我们的数据过期的需求。

需求分析:

  • 存入数据时,顺带传入过去时间;
  • 获取数据时,判断当前是否过期,过期返回 undefined; 否则正常返回数据。

动手实践

localStorage 和 sessionStorage 都继承自 Storage 对象, 所以我们可以扩展Storage原型方法。

setStorageWithAge(key, value, age) 方法, 接收三个参数,第三个参数代表最大过期时间,我们这里参考 cookie的 Max-Age 的实现,用相对时间来做。

getStorageWithAge(key),内部直接判断时间是否过期来返回对应的值。

代码实现:

Storage.prototype.setStorageWithAge = (key, value, age) => {
    if (isNaN(age) || age < 1) throw new Error("age must be a number");
    const obj = {
        data: value, //存储值
        time: Date.now(), //存值时间戳
        maxAge: age, //过期时间
    };
    localStorage.setItem(key, JSON.stringify(obj));
};

Storage.prototype.getStorageWithAge = key => {
    const { data, time, maxAge } = JSON.parse(localStorage.getItem(key));
    if (time + maxAge < Date.now()) {
        localStorage.removeItem(key);
        return undefined;
    }
    return data;
};

尝试调用:

localStorage.setStorageWithAge('amingxiansen', '测试过期时间', 30000);
localStorage.getStorageWithAge('amingxiansen');

设定30s的过期时间,过期之前和过期之后获取到的结果。

参考文章

  • localStorage设置有效期、过期时间

总结

Storage只是浏览器的一种存储方案,除此之外还有IndexDB、WebSQL等。

这种实现数据过期机制的思路比较通用,可以扩展到其他需要设置数据过期的场景下。

到此这篇关于如何实现localStorage过期机制的文章就介绍到这了,更多相关localStorage的过期机制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 给localStorage设置一个过期时间的方法分享

    思考点 在 web 开发中,我们知道 cookie.session.localStorage都可以保存用户的数据,cookie的 domain.path 限制了 cookie 的跨域, 有数量和大小的限制,可以设置有效时间. session是后台在浏览器注入一个设置了 httponly 的不可读取的 cookie , session data由后台保存在数据库或者内存中,在web中,session 是靠 cookie 作为唯一标示来实现的,也可以设置过期时间. localStorage 是 H5

  • localStorage过期时间设置的几种方法

    目录 问题描述 1.初级解法 2.中级解法 3.高级解法 4.骨灰级解法 聊到 localStorage 想必熟悉前端的朋友都不会陌生, 我们可以使用它提供的 getItem, setItem, removeItem, clear 这几个 API 轻松的对存储在浏览器本地的数据进行**「读,写, 删」操作, 但是相比于 cookie, localStorage 唯一美中不足的就是「不能设置每一个键的过期时间」**. localStorage 属性允许我们访问一个 Document 源(origi

  • localstorage实现带过期时间的缓存功能

    前言 一般可以使用cookie,localstorage,sessionStorage来实现浏览器端的数据缓存,减少对服务器的请求. 1.cookie数据存放在本地硬盘中,只要在过期时间之前,都是有效的,即使重启浏览器.但是会在每次HTTP请求中添加到请求头中,如果数据过多,会造成性能问题. 2.sessionStorage保存在浏览器内存中,当关闭页面或者浏览器之后,信息丢失. 3.localstorage也是保存在本地硬盘中,除非主动清除,信息是不会消失的.但是实际使用时我们需要对缓存设置过

  • 一文教你如何实现localStorage的过期机制

    目录 前言 cookie过期机制 expires和max-age的区别 localStorage数据过期 需求分析: 动手实践 参考文章 总结 前言 我们都知道cookie存储的数据是可以添加过期时间属性(Expires/Max-Age),实现过期的. 那么,LocalStrorage.sessionStrorage可以设置过期吗?? 带着这样的疑问,我们一层层剥开其神秘的面纱. cookie过期机制 我们知道Expires和Max-age都可以设置cookie的过期时间,那么两者存在什么样的异

  • 本地存储localStorage设置过期时间示例详解

    目录 思考 实现思路 代码实现 代码测试 思考 在我们使用cookie的时候是可以设置有效期的,但是localStorage本身是没有该机制的,只能人为的手动删除,否则会一直存放在浏览器当中,可不可以跟cookie一样设置一个有效期.如果一直存放在浏览器又感觉有点浪费,那我们可以把localStorage进行二次封装实现该方案. 实现思路 在存储的时候设置一个过期时间,并且存储的数据进行格式化方便统一校验,在读取的时候获取当前时间进行判断是否过期,如果过期进行删除即可. 代码实现 目录结构 en

  • IIS的内容缓存过期机制实践 有效提高站点性能

    我们的网站中往往包含大量的页面组件,比如图片.样式表文件.JS脚本文件和Flash动画.这些组件的变化频率非常低,尤其是那些构成网站基本框架的组件, 几乎不会发生变化.我们可以将这些变化率很低的组件看作静态内容,利用IIS的内容过期机制和浏览器的本地缓存机制将它们在访问者的电脑硬盘中保存一段时间. 当访问者访问你的网站时,如果这些存在本地的静态内容没有过期,浏览器会从本地硬盘中装载,而不去向服务器发出请求. 如果你使用Fiddler这样的工具跟踪网页访问,你会清楚地看到虽然只是访问一个页面,但是

  • 浅谈Redis中的自动过期机制

    目录 Redis中的自动过期机制 一.使用Redis Key自动过期机制 二.SpringBoot整合key失效监听 Redis中的自动过期机制 实现需求:处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态 1.使用Redis Key自动过期出发事件通知2.使用定时任务30分钟后检查3.按照每分钟轮训检查 CREATE TABLE `order_number` ( `id` int(11) NOT NULL AUTO_INCREMENT, `order_name` varchar(25

  • 深入讲解PHP Session及如何保持其不过期的方法

    SESSION的实现中采用COOKIE技术,SESSION会在客户端保存一个包含session_id(SESSION编号)的COOKIE:在服务器端保存其他session变量,比如session_name等等.当用户请求服务器时也把session_id一起发送到服务器,通过 session_id提取所保存在服务器端的变量,就能识别用户是谁了.同时也不难理解为什么SESSION有时会失效了. 当客户端禁用COOKIE时(点击IE中的"工具"-"Internet选项",

  • .NET Core系列之MemoryCache 缓存过期

    在上一篇"拥抱.NET Core系列:MemoryCache 初识"中我们基本了解了缓存的添加.删除.获取,那么今天我们来看看缓存的过期机制.这里和上篇一样将把"Microsoft.Extensions.Caching.Memory"简称为MSCache. MSCache项目 MSCache目前最新的正式版是 2.0.0,预览版是2.1.0,会与.NETCore 2.1一起发布.本篇用了2.0.0版本 开源在GitHub上,仓库地址是:https://github.

  • Redis数据过期策略的实现详解

    目录 一.设置过期时间 1.常用方式 2.字符串独有方式 二.3种过期策略 三.Redis采用的过期策略 四.RDB对过期key的处理 五.AOF对过期key的处理 本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存session,又或者只存放日行情股票数据)那么就会出现一下几个问题了 Redis会自己回收清理不用的数据吗?如果能,那如何配置?如果不能,如何

  • 详解vue项目中使用token的身份验证的简单实践

    工作原理 前端页面进行登录操作, 将用户名与密码发给服务器; 服务器进行效验, 通过后生成token, 包含信息有密钥, uid, 过期时间, 一些随机算法等 ,然后返回给前端 前端将token保存在本地中, 建议使用localstorage进行保存.  下次对服务器发送请求时, 带上本地存储的token 服务器端,进行对token的验证, 通过的话, 进行相应的增删改查操作, 并将数据返回给前端 为通过则返回错误码, 提示保错信息, 然后跳转到登录页. 具体步骤 所用技术: vuex + ax

随机推荐