uniapp存储携带过期时间
uniapp存储携带过期时间
项目中存储的过期时间一般会做两种校验。1.接口校验失败返回401。 2.本地存储的过期时间。本文介绍uniapp自定义封装存储,实现存储可携带过期时间。
详细代码
// 定义一小时对应的毫秒数,用于计算过期时间
const H = 60 * 60 * 1000;
class Storage {
constructor(prefix) {
// 如果没有传入 prefix 参数,则使用配置文件中的 name 属性作为前缀
this.prefix = prefix || "zStorage";
}
// 根据传入的键生成带有前缀的完整键名
getKey(key) {
return `__${this.prefix}_${key}__`;
}
// 设置存储数据,支持设置过期时间
set(key, value, expire = 1) {
const KEY = this.getKey(key);
try {
// 将数据和过期时间封装成一个对象并转换为 JSON 字符串
const data = JSON.stringify({
value,
expire: !expire ? null : Date.now() + expire * H,
});
// 使用 uni-app 的同步存储方法将数据存储到本地
uni.setStorageSync(KEY, data);
} catch (error) {
console.error("存储数据时出错:", error);
}
}
// 获取存储的数据,会检查数据是否过期
get(key) {
const KEY = this.getKey(key);
try {
// 使用 uni-app 的同步获取方法从本地获取数据
const val = uni.getStorageSync(KEY);
if (!val) {
return null;
}
// 将获取到的 JSON 字符串解析为对象
const { value, expire } = JSON.parse(val);
if (expire && expire < Date.now()) {
// 若数据已过期,调用 remove 方法删除该数据
this.remove(key);
return null;
}
return value;
} catch (error) {
// 原来的存token可能不是JSON格式,所以这里需要兼容一下
console.error("获取数据时出错:", error);
return null;
}
}
// 删除指定键的存储数据
remove(key) {
const KEY = this.getKey(key);
try {
// 使用 uni-app 的同步删除方法从本地删除数据
uni.removeStorageSync(KEY);
} catch (error) {
console.error("删除数据时出错:", error);
}
}
// 清空所有本地存储数据
clear() {
try {
// 使用 uni-app 的同步清空方法清空本地存储
uni.clearStorageSync();
} catch (error) {
console.error("清空存储时出错:", error);
}
}
}
export default Storage;
注意事项:
1. 在存储时会先进行自定义key的编码处理,防止变量污染。
2. 在获取对应的json解析值时需要做异常处理,因为正在使用的版本中可能存储的不是json值,并且需要在异常条件中返回null,做兼容处理
使用示例
// 在main.js或全局进行挂载
import StorageExpire from "@/utils/storage";
uni.$storage = new StorageExpire();
// xxx.vue 中使用
uni.$storage.set("token", token, 2); // 单位是小时
const token = uni.$storage.get("token")