当前位置: 首页 > news >正文

JS--localStorage设置过期时间的方案(有示例)

原文网址:JS--localStorage设置过期时间的方案(有示例)_IT利刃出鞘的博客-CSDN博客

简介

说明

本文介绍如何使用localStorage设置数据的过期时间。

问题描述

localStorage是不支持设置过期时间的,cookie虽然支持设置过期时间但它存的数据量很小。所以在需要存一些带过期时间的数据时,就要手写工具来实现。

思路

存数据时:将value封装到一个对象里,这个对象里额外加一个过期时间。

读数据时:如果当前时间超过了过期时间,则返回null或者空对象;否则返回value。

测试结果

如下几种方案的测试结果都是一样的:

第一次获取时获取到了数据;4秒后数据过期了,再获取时成了null。

方案1:封装为函数

js

/*** 写入localStorage* @param key    key* @param value  value* @param expire 超时时间(以秒为单位)*/
function writeExpire(key, value, expire) {let obj = {time: new Date().getTime(),data: value,expire: expire,};let objStr = JSON.stringify(obj);localStorage.setItem(key, objStr);
}/*** 读出localStorage*/
function readExpire(key) {let value = localStorage.getItem(key);if (!value || value === "null") {return value;}value = JSON.parse(value);if (Date.now() - value.time > value.expire * 1000) {localStorage.removeItem(key);return null;}return value.data;
}

html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="LocalStorageUtil.js"></script>
</head>
<body>
<script>writeExpire("key1", "value1", 2)console.log(readExpire("key1"));sleep(4000).then(() => {console.log(readExpire("key1"));})function sleep(time) {return new Promise((resolve) => setTimeout(resolve, time));}
</script>
</body>
</html>

方案2:封装为对象

js

export let localStorageUtil = {/*** 写入localStorage* @param key    key* @param value  value* @param expire 超时时间(以秒为单位)*/writeExpire: function (key, value, expire) {let obj = {time: new Date().getTime(),data: value,expire: expire,};let objStr = JSON.stringify(obj);localStorage.setItem(key, objStr);},/*** 读出localStorage*/readExpire: function (key) {let value = localStorage.getItem(key);if (!value || value === "null") {return value;}value = JSON.parse(value);if (Date.now() - value.time > value.expire * 1000) {localStorage.removeItem(key);return null;}return value.data;}
}// export default localStorageUtil;

html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script type="module">import {localStorageUtil} from "./LocalStorageUtil.js";localStorageUtil.writeExpire("key1", "value1", 2)console.log(localStorageUtil.readExpire("key1"));sleep(4000).then(() => {console.log(localStorageUtil.readExpire("key1"));})function sleep(time) {return new Promise((resolve) => setTimeout(resolve, time));}
</script>
</body>
</html>

方案3:ES5扩展localStorage

js

/*** 写入localStorage* @param key    key* @param value  value* @param expire 超时时间(以秒为单位)*/
Storage.prototype.writeExpire = (key, value, expire) => {let obj = {data: value,time: Date.now(),expire: expire};//localStorage 设置的值不能是对象,转为json字符串localStorage.setItem(key, JSON.stringify(obj));
}/*** 读出localStorage*/
Storage.prototype.readExpire = key => {let value = localStorage.getItem(key);if (!value || value === "null") {return null;}val = JSON.parse(value);if (Date.now() - val.time > val.expire * 1000) {localStorage.removeItem(key);return null;}return val.data;
}

html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script type="module">import './LocalStorageUtil.js';localStorage.writeExpire("key1", "value1", 2)console.log(localStorage.readExpire("key1"));sleep(4000).then(() => {console.log(localStorage.readExpire("key1"));})function sleep(time) {return new Promise((resolve) => setTimeout(resolve, time));}
</script>
</body>
</html>

方案4:ES6扩展localStorage

js

class LocalStorageUtil {constructor() {this.storage = window.localStorage;}/*** 写入localStorage* @param key    key* @param value  value* @param expire 超时时间(以秒为单位)*/writeExpire(key, value, expire) {let tempObj = {};tempObj.key = key;tempObj.value = value;tempObj.expire = Date.now() + expire * 1000;this.storage[key] = JSON.stringify(tempObj);return tempObj;}/*** 读出localStorage*/readExpire(key) {let value = localStorage.getItem(key);if (!value || value === "null") {return null;}let valueObject = JSON.parse(value);let expire = valueObject["expire"];if (!expire) {return valueObject.value;}if (Date.now() >= expire) {this.remove(key);return null;}return valueObject.value}remove(key) {this.storage.removeItem(key);}
}export default LocalStorageUtil;

html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script type="module">import LocalStorageUtil from "./LocalStorageUtil.js";let localStorageUtil = new LocalStorageUtil();localStorageUtil.writeExpire("key1", "value1", 2)console.log(localStorageUtil.readExpire("key1"));sleep(4000).then(() => {console.log(localStorageUtil.readExpire("key1"));})function sleep(time) {return new Promise((resolve) => setTimeout(resolve, time));}
</script>
</body>
</html>

http://www.lryc.cn/news/238395.html

相关文章:

  • JNPF开发平台凭什么火?
  • 关于“计算机中由于找不到msvcr120.dll,无法继续执行代码5种解决方法
  • LR学习笔记——基本面板
  • Cloud 微服务
  • 若依前后端分离版,快速上手
  • Java-抽象类、抽象方法
  • 南京--ChatGPT/GPT4 科研实践应用
  • 【VRTK】【VR开发】【Unity】7-配置交互能力和向量追踪
  • 【JS】Chapter14-深入面向对象
  • RabbitMQ消息队列快速入门
  • django DRF认证组件
  • 操作系统(三)| 进程管理上 进程状态 同步 互斥
  • Postman插件如何安装(一)
  • 在回调之间共享数据
  • 我在CSDN开组会1-蒙特卡洛模拟在矿床学的应用展望
  • Jmeter 性能测试基础!
  • 【赠书第6期】MATLAB科学计算从入门到精通
  • Java语言基础第五天
  • linux网络——HTTPS加密原理
  • shell 各种括号作用总结
  • 2023-11-18 mysql-sysbench压测TPS/QPS-记录
  • 树与二叉树堆:树
  • 【监控系统】日志可视化监控体系ELK搭建
  • 【Linux】22、CPU 评价指标、性能工具、定位瓶颈、优化方法论:应用程序和系统
  • Foodpanda API连接的艺术:无代码开发如何集成营销系统和广告推广工具
  • SpringBoot——数据访问
  • 【C++深度剖析学习总结】28 函数对象分析
  • 持续集成部署-k8s-配置与存储-配置管理:SubPath
  • git容易出问题的命令
  • Mongodb命名和文档限制