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

浏览器本地存储

🔍 什么是本地存储(Web Storage)?

Web Storage API 是 HTML5 提供的客户端存储机制,允许在用户的浏览器中以键值对形式保存数据。无需与服务器交互,适用于保存小量、非敏感的数据。


🧩 本地存储的两种类型

类型名称生命周期可用大小作用范围
localStorage本地存储永久(除非手动删除)约 5~10MB当前域名下共享
sessionStorage会话存储当前标签页关闭即失效约 5MB当前标签页下独立

📘 基本 API 语法(两种存储共用)

// 设置数据
localStorage.setItem('key', 'value')// 获取数据
const value = localStorage.getItem('key')// 删除某项
localStorage.removeItem('key')// 清空所有数据
localStorage.clear()// 获取 key 列表中的第 N 个键名
localStorage.key(index)// 获取数据长度(多少个键值)
localStorage.length

✅ sessionStorage 也完全相同,只需替换对象名即可。

📦 存储对象和数组的注意点(JSON)

Web Storage 只能存储字符串,如需存储对象或数组,需手动转换:

const user = { name: 'Alice', age: 22 }// 存储对象
localStorage.setItem('user', JSON.stringify(user))// 读取并还原对象
const stored = JSON.parse(localStorage.getItem('user'))
console.log(stored.name)  // Alice

🔐 localStorage vs sessionStorage 对比

功能localStoragesessionStorage
生命周期永久保存(除非清除)仅当前标签页,关闭即清除
跨页面共享同源下全部页面可访问不可共享(每标签页独立)
应用场景登录状态、用户偏好表单暂存、一步步流程等
安全性较低,不适合存敏感数据同样不安全

💡 localStorage 应用示例

✅ 用户偏好设置保存

// 夜间模式开关
function toggleDarkMode() {const isDark = document.body.classList.toggle('dark')localStorage.setItem('dark-mode', isDark)
}// 页面加载时自动应用
if (localStorage.getItem('dark-mode') === 'true') {document.body.classList.add('dark')
}

🚨 安全 & 限制注意事项

⚠️ 1. 不能存敏感数据(如密码、Token)
• localStorage 是明文可见,任何脚本或浏览器扩展都可读

⚠️ 2. 跨域限制
• Web Storage 是 同源策略 的(协议+域名+端口必须一致)

⚠️ 3. 存储空间有限
• 一般为 5MB,超出将触发 QuotaExceededError

⚠️ 4. 不能监听变化跨标签页同步(sessionStorage 完全不能)

🔄 监听 localStorage 改变(用于多标签同步)

window.addEventListener('storage', (event) => {console.log('Key changed:', event.key)console.log('New value:', event.newValue)
})

仅当不同标签页之间更改 localStorage 时才触发。

🧠 最佳实践总结

实践建议描述
✅ 使用 JSON 存储结构化数据
✅ 设置命名空间(如:app_user_token)
✅ 页面加载时读取必要状态,如语言、暗黑模式
❌ 不存储敏感信息
❌ 不依赖 localStorage 实现身份认证(使用 Cookie + HttpOnly 更安全)

🚀 进阶替代方案

技术特点
IndexedDB更大容量、更复杂结构、异步操作
Cookies可与服务端通信,但大小限制 4KB
Cache API用于缓存资源文件(如 PWA)

Cookies

🍪 什么是 Cookie?

Cookie 是浏览器存储在用户计算机上的小型文本文件,通常用于:
• 保存登录状态
• 记录用户行为
• 与服务器共享状态信息

📏 Cookie 特点

特性描述
大小限制每个 Cookie 最多约 4KB
数量限制每个域最多存 20-50 个 Cookie
作用域绑定域名(可设置子域访问)
自动传输每次请求自动随 header 发送给服务器(Cookie: …)
过期时间可设置,默认是“会话级别”

🛠️ 设置/读取 Cookie 的基本语法(原生)

// 设置 cookie
document.cookie = "username=alice; expires=Fri, 31 Dec 2025 23:59:59 GMT; path=/";// 读取 cookie
console.log(document.cookie) // 所有 cookie 字符串// 删除 cookie(通过设置过期时间)
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"

⚠️ Cookie 是字符串拼接形式,使用麻烦,因此推荐封装或使用第三方库。

⚙️ 推荐使用封装工具(Vue 项目中更方便)

✅ 使用 js-cookie 库(轻量、好用)

安装:npm install js-cookie使用:import Cookies from 'js-cookie'// 设置
Cookies.set('token', 'abc123', { expires: 7 })  // 7 天过期// 读取
const token = Cookies.get('token')// 删除
Cookies.remove('token')

✅ 自动处理编码、过期、path 等问题

🔐 客户端 vs 服务端 Cookie

分类前端 JS 可访问会自动发送到服务器示例
普通 Cookie登录信息、语言设置
HttpOnly Cookie❌(JS 不可读)安全的 Token 或会话标识(session id)
Secure Cookie✅(仅 HTTPS)只在安全连接上传输

HttpOnly 和 Secure Cookie 只能由后端通过 Set-Cookie 设置,前端无法直接设置。

🧠 Cookie vs localStorage vs sessionStorage

特性CookielocalStoragesessionStorage
最大容量4KB~5MB~5MB
生命周期可设置永久标签页关闭后清除
自动发送给服务器
JS 可访问✅(HttpOnly 不可)
典型用途认证、会话用户设置、缓存表单暂存、临时状态

🧩 在 Vue 中使用 Cookie(组合示例)

// utils/cookie.js
import Cookies from 'js-cookie'export const setToken = (token) => Cookies.set('token', token, { expires: 7 })
export const getToken = () => Cookies.get('token')
export const removeToken = () => Cookies.remove('token')// 在组件中使用
import { getToken, setToken } from '@/utils/cookie'onMounted(() => {const token = getToken()if (token) {console.log('用户已登录,token:', token)}
})

🧱 服务端设置 Cookie(参考)

Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure; SameSite=Strict

通常登录成功后,后端设置 Cookie 返回给浏览器,前端无需保存 token。

http://www.xdnf.cn/news/9808.html

相关文章:

  • 计算机图形学:(六)渲染管线
  • java24
  • 信创改造选择C86,相比于ARM架构有什么优势?
  • HOW - 简历和求职面试宝典(八)
  • 代理模式核心概念
  • 实时操作系统在脑机接口中的技术平衡:满足实时性与 AI 算力需求
  • 深入理解C#泛型:提升代码复用与类型安全的利器
  • STM32CUBE打印浮点数据-cmake配置
  • MySQL、PostgreSQL、Oracle 区别详解
  • 一个超简易的RMAN备份并保留到异地的方案,仅适用于小规模环境
  • 【大模型MCP】MCP 深度解析:AI 时代的「USB-C」接口——原理、对比、实战代码与行业落地
  • 国产三维CAD皇冠CAD(CrownCAD)在专用设备建模教程:液压升降机
  • qlora
  • 电网中三相不平衡治理的全面解析
  • 什么是范式?三大范式分别是什么?
  • JavaScript 中的 BigInt:当普通数字不够“大“时的救星
  • 企业级网络管理实战:Linux、云与容器的深度融合与优化
  • 苹果签名应用掉签频繁原因排查以及如何避免
  • 实测,大模型谁更懂数据可视化?
  • Linux应用开发之网络套接字编程
  • 基于 Arduino Uno R3 的温湿度控制风扇系统开发记录
  • Java ThreadLocal 应用指南:从用户会话到数据库连接的线程安全实践
  • 线程池上下文泄漏:跨线程池的ThreadLocal污染与防御之道
  • 【Unity高级】ScriptableObject 全面解析:从理论到实战
  • 【JSON-to-Video】添加背景图与动效技巧
  • RAII(资源获取即初始化)机制详解
  • leetcode0954. 二倍数对数组-medium
  • 【LangChain】LangChain2-基础概念P1-输入控制与输出解析
  • 负载电容匹配:晶振电路设计中被忽视的隐形杀手
  • AI模型升级与机器人产业落地同步推进