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

LocalStorage和SessionStorage的区别和应用

LocalStorage 和 SessionStorage 都是浏览器提供的 Web Storage API,常用于前端缓存数据,但它们在生命周期、作用范围、使用场景等方面有明显区别。

一、区别对比表

特性LocalStorageSessionStorage
生命周期永久保存,除非手动删除当前标签页会话,页面关闭即清除
存储大小一般约 5~10MB一般约 5MB
是否随请求发送❌ 不会❌ 不会
页面刷新后✅ 数据还在✅ 数据还在
新标签页打开✅ 共享❌ 不共享
API 同步/异步同步 API同步 API
数据类型支持仅支持字符串(需要手动转换为对象)仅支持字符串(需要手动转换为对象)

二、应用场景分析

LocalStorage:适合需要持久保存的数据

  • 适用场景:

    • 登录 Token(如果非敏感)

    • 用户偏好设置(如主题色、语言)

    • 搜索历史记录、本地草稿

    • 接口缓存数据(非敏感)

  • 示例:

// 存储
localStorage.setItem('token', 'abc123');
localStorage.setItem('theme', 'dark');// 获取
const token = localStorage.getItem('token');// 删除
localStorage.removeItem('token');

SessionStorage:适合临时、当前会话用完就清的数据

  • 适用场景:
    • 多步表单中间数据

    • 登录跳转回之前页面临时状态

    • 某些不希望在新标签页共享的临时变量

  • 示例:
// 存储
sessionStorage.setItem('step1Data', JSON.stringify({ name: '淇淇' }));// 获取
const data = JSON.parse(sessionStorage.getItem('step1Data'));// 清除
sessionStorage.clear();

三、结合实际建议

场景推荐使用原因
登录 token(前端存储时)LocalStorage保留登录状态,刷新不丢失
表单临时数据(多步骤)SessionStorage用户关闭页面即清理,防止数据过期
用户偏好(如语言、主题色)LocalStorage长久生效,适合持久配置
接口缓存(短时间内复用)Vuex + Local/SessionStorage根据数据重要性和时效性选择组合
敏感信息❌建议不存储建议放在 Cookie(HttpOnly)或只存在内存中

四、用LocalStorage封装一个带有效期的缓存方法

/*** LocalStorage 带有效期缓存* ttl 单位:毫秒*/
const LSCache = {/*** 设置缓存* @param {string} key   键名* @param {*}      value 任意可序列化的数据* @param {number} ttl   有效期(毫秒),如 30 分钟 => 30 * 60 * 1000*/set(key, value, ttl) {const expire = Date.now() + ttl;const record = { value, expire };localStorage.setItem(key, JSON.stringify(record));},/*** 读取缓存(自动判断是否过期)* @param  {string} key* @return {*} 数据或 null(不存在 / 已过期)*/get(key) {const str = localStorage.getItem(key);if (!str) return null;try {const { value, expire } = JSON.parse(str);if (expire === 0 || expire >= Date.now()) {return value;}// 过期自动清理localStorage.removeItem(key);} catch (_) {// 数据被篡改或非 JSON,直接删除localStorage.removeItem(key);}return null;},/** 手动删除 */remove(key) {localStorage.removeItem(key);},/** 扫描所有 key,清理过期数据(可在 App 启动或定时调用) */clearExpired() {Object.keys(localStorage).forEach(k => this.get(k));}
};

使用范例

// 存 30 分钟
LSCache.set('token', 'abc123', 30 * 60 * 1000);// 读取
const token = LSCache.get('token');
if (token) {console.log('token 未过期:', token);
}// 手动删除
LSCache.remove('token');// 启动时批量清理过期
LSCache.clearExpired();
http://www.xdnf.cn/news/1089127.html

相关文章:

  • 零基础 Qt 6 在线安装教程
  • C++11 算法详解:std::copy_if 与 std::copy_n
  • 基于物联网架构的温室环境温湿度传感器节点设计
  • C++ 遍历可变参数的几种方法
  • Android Jetpack Compose状态管理与状态提升
  • Spring Batch终极指南:原理、实战与性能优化
  • 从单体到微服务:Spring Cloud 开篇与微服务设计
  • 【王树森推荐系统】召回12:曝光过滤 Bloom Filter
  • vscode打开stm32CubeIDE的项目的注释问题
  • JK触发器Multisim电路仿真——硬件工程师笔记
  • CSS知识复习5
  • 20 道 Node.js 高频面试题
  • Docker快速部署Hive服务
  • Flutter基础(前端教程②-卡片列表)
  • 原生屏幕旋转算法(AccelSensor)
  • Ansible 介绍及安装
  • 【牛客刷题】小红的v三元组
  • Spring Boot 企业项目技术选型
  • SystemVerilog 断言重复操作符和序列操作符
  • 力扣 239 题:滑动窗口最大值的两种高效解法
  • 【C++】AVL树底层思想 and 大厂面试
  • SPI / I2C / UART 哪个更适合初学者?
  • C++内存泄漏排查
  • Next.js 实战笔记 2.0:深入 App Router 高阶特性与布局解构
  • 嘉立创黄山派下载watch ui demo 教程(sf32)
  • 为什么elementui的<el-table-column label=“名称“ prop=“name“ label不用写成:label
  • 短视频矩阵系统的崛起:批量发布功能与多平台矩阵的未来
  • NFT,Non-Fungible Token,非同质化代币
  • 科技云报到:云智融合双buff,AI已开挂
  • Linux 第一个系统程序 - 进度条