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

Cookie 与 sessionStorage 的区别与用法,解决浏览器多开,cookie覆盖问题。

Cookie 与 sessionStorage 的区别与用法

​ 今天在写项目的时候测试发现个bug,应该是全栈萌新都会遇到。业务场景如下:

当前一个浏览器,同时登录10个不同的账号,访问你的服务器应用,其中有一个退出了,其他的用户都退出了。这是个很明显的bug,之前做的时候只是一个浏览器测试没发现这个问题。产生这个原因如下: 前端请求拦截和响应,在做处理的时候是基于cookie做的处理导致的,至于cookie的特点用法后边说。因为用了cookie在当前浏览器共享了信息导致的,cookie的作用域在同源(所有标签页/窗口共享),存储也是最久的。我在登录的时候把需要认证的东西放在cookie,直接在 Header 中读取 cookieconst userRoleCookie = useCookie('userRole')这样干导致的。所有后边考虑到了一个浏览器可能登录多个用户,必须隔离所以,做了隔离用sessionStorage解决了。那么sessionStorage的法就是解决上边的业务场景的,主要是做隔离,单页应用的。这两个没有谁好谁坏,不同场景需求不同。

一、核心区别速查表

对比维度CookiesessionStorage
存储大小约 4KB约 5-10MB
生命周期可设置过期时间(Expires/Max-Age)标签页关闭即清除
作用域同源(所有标签页/窗口共享)单个标签页(独立隔离)
发送机制每次 HTTP 请求自动携带(Cookie头)不会自动发送,需手动读取放在请求头
服务端访问✅ 服务端可直接读取(HttpServletRequest❌ 服务端无法直接读取
安全性可设置HttpOnly防止 XSS 读取易受 XSS 攻击(无 HttpOnly 选项)
同标签页刷新✅ 保留✅ 保留
关闭浏览器✅ 保留(未过期前)❌ 全部清除
跨标签页通信✅ 可共享(被覆盖是共享的代价)❌ 不可共享(这正是隔离的优势)
使用场景服务端认证、会话标识、偏好设置前端临时状态、单页应用隔离认证、多标签页独立登录

二、为什么项目需要从 Cookie 切换到 sessionStorage?

问题复现流程

步骤使用 Cookie(❌ 错误)使用 sessionStorage(✅ 正确)
用户A在标签页1登录Cookie 存入 authKey_AsessionStorage(标签页1)存入 authKey_A
用户B在标签页2登录Cookie 被覆盖为 authKey_BsessionStorage(标签页2)独立存入 authKey_B
用户A点击操作❌ 请求携带 authKey_B,认证失败✅ 请求携带 authKey_A,认证成功
用户B退出❌ Cookie 被清除,标签页1丢失认证✅ 仅清除标签页2的 sessionStorage,标签页1不受影响

一句话总结:Cookie 是浏览器级共享 → 多标签页不同用户会相互覆盖;sessionStorage 是标签页级隔离 → 各标签页用户互不干扰。

三、sessionStorage 在 Nuxt3 中的完整用法

1. 安装 VueUse(Nuxt3 推荐方案)
pnpmadd@vueuse/nuxt @vueuse/core

配置nuxt.config.ts

exportdefaultdefineNuxtConfig({modules:['@vueuse/nuxt']})
2. 登录页面存储
<script setup> import { useSessionStorage } from '@vueuse/core' // 创建响应式引用,每个标签页独立 const authKey = useSessionStorage('authKey', '') const userRole = useSessionStorage('userRole', '') const userName = useSessionStorage('userName', '') const handleLogin = async () => { const response = await login(form) const { authKey: key, role, userName: name } = response.data // 存储到当前标签页 authKey.value = key userRole.value = role.toString() userName.value = name await router.push('/') } </script>
3. 请求拦截器读取
// request.jsimport{useSessionStorage}from'@vueuse/core'request.interceptors.request.use((config)=>{constauthKey=useSessionStorage('authKey').valueif(authKey){config.headers['AuthKey']=authKey// 手动放入请求头}returnconfig})
4. 退出登录清除
// 退出或 401 响应时constauthKey=useSessionStorage('authKey')constuserRole=useSessionStorage('userRole')constuserName=useSessionStorage('userName')authKey.value=nulluserRole.value=nulluserName.value=nullrouter.push('/login')

四、Cookie 的正确用法(什么时候用 Cookie?)

当您需要服务端直接读取认证信息时,才用 Cookie:

// 服务端读取 Cookie@GetMapping("/user")publicUserDTOgetUser(HttpServletRequestrequest){Cookie[]cookies=request.getCookies();for(Cookiecookie:cookies){if("authKey".equals(cookie.getName())){StringauthKey=cookie.getValue();// 验证 authKey...}}}

典型场景

  • 服务端 Session 管理
  • 记住登录状态(rememberMe
  • 需要服务端直接读取的认证信息

但如果您用的是前后端分离 + Token(如 authKey 放在请求头),则不应该用 Cookie 存储 authKey,而应该用 sessionStorage。

五、最佳实践总结

存储位置适合存储的内容不适合存储的内容
Cookie服务端需要读取的会话ID、偏好设置、rememberMe标识敏感 Token(易被 XSS 窃取,除非设置HttpOnly
sessionStorage前端认证 Token、当前标签页状态、临时表单数据需要跨标签页共享的数据
localStorage长期本地缓存、用户设置、主题偏好任何敏感认证信息(永不过期,易被 XSS 窃取)
Pinia/Vuex全局状态管理(配合 sessionStorage 持久化)无(内存存储,刷新即失)

六、您的项目改造清单

文件修改内容
request.jsuseCookie('authKey')useSessionStorage('authKey')
登录页面useCookie('authKey').value = keyauthKey.value = key
响应拦截器 401useCookie('authKey').value = nullauthKey.value = null
退出逻辑同上,清除 sessionStorage
后端无需修改,请求头AuthKey不变

七、关键注意事项

  1. useSessionStorage只在客户端可用,不要在服务端渲染时调用(Nuxt 中在onMounted或拦截器中使用是安全的)。
  2. useCookieuseSessionStorage在 Nuxt3 中的行为不同
    • useCookie是 Nuxt 内置的 SSR 友好 Cookie 管理
    • useSessionStorage是 VueUse 提供的客户端存储封装
  3. 改造后,同一个浏览器的多个标签页可以独立登录不同用户,互不干扰。
  4. 关闭标签页后,sessionStorage 自动清除,无需手动清理(更安全)。
http://www.jsqmd.com/news/1028945/

相关文章:

  • 制动信号人工采集效率低,LabVIEW定制调试
  • 2026大兴安岭业主高频选择的 5 家专业验房检测机构实地测评整理 毛坯验房 + 精装验房 + 空鼓开裂检测 附电话地址 - 科信检测
  • XNBCLI:星露谷物语模组开发者的终极XNB资源处理利器
  • 2026年空气悬浮鼓风机生产厂家选购指南:深度解析代表性品牌 - 速递信息
  • 全套劳力士黑水鬼在重庆回收多少钱?实拍完整估价流程 - 讯息早知道
  • 今晚8点正式开始:618迎来最后一波降价潮!买家电、苹果手机、空调抄底价来袭,错过等一年! - 资讯焦点
  • 2026年试了7款录音转文字工具,准确率稳定性性价比真实体验
  • 青岛金价冲上943元 克市南区上门回收黄金快速变现 - 上门黄金回收
  • 2026鸡西业主高频选择的 5 家专业验房检测机构实地测评整理 毛坯验房 + 精装验房 + 空鼓开裂检测 附电话地址 - 科信检测
  • NarratoAI终极教程:3步打造专业级AI视频解说,免费开源让创作更简单
  • 豆包炒股的10个万能提问模板:散户AI实战指南
  • 原神FPS解锁工具:突破60帧限制的完整解决方案
  • 2026湛江黄金回收价格一览 正规商家与避坑技巧 - 余生黄金回收
  • 2026国内比赛竞赛服务机构权威排行|5家专业服务商核心能力全对比 - 互联网科技品牌测评
  • 2026庆阳本地噪音检测哪家专业?TOP 正规机构榜单 + 环境噪声 + 工业噪音 + 低频噪音检测 附电话地址 - 鉴安检测
  • CXL内存池优化大语言模型Engram存储的技术实践
  • 2026鹰潭黄金回收全攻略五家实体门店横向评测附详细地址避坑指南 - 润富黄金回收
  • 2026邯郸业主高频选择的 5 家专业验房检测机构实地测评整理 毛坯验房 + 精装验房 + 空鼓开裂检测 附电话地址 - 科信检测
  • 2026襄阳本地噪音检测哪家专业?TOP 正规机构榜单 + 环境噪声 + 工业噪音 + 低频噪音检测 附电话地址 - 鉴安检测
  • 盛夏缤纷 四店齐开:千美臣七星级旗舰升级重新定义美业新标准 - 资讯报道
  • 2026年精选品牌:涡街流量计厂家深度横评:国产五家对决进口五家,厂蒸汽计量、市政供热管网监测选型 - 资讯焦点
  • 在宁波变现黄金怎么不亏?2026 权威门店推荐 - 名奢变现站
  • 2026襄阳本地环评检测哪家专业?TOP 正规机构榜单+环境监测 + CMA 检测 + 环保验收 附电话地址 - 中检检测集团
  • 终极免费游戏王离线对战:YgoMaster完整使用指南
  • Java毕设项目: 于 JavaWeb 的社区住宅维修资源管理系统设计 智慧物业背景下小区维修服务管理系统设计实现(源码+文档,讲解、调试运行,定制等)
  • 2026中山黄金回收价格表 - 余生黄金回收
  • 2026上海非标定制木质包装公司 实测 TOP5 异形木箱托盘定做避坑指南 - LYL仔仔
  • 都有哪些好用文件加密软件?5 款热门文件加密软件推荐,把文件锁进数字保险柜
  • 告别自动切换:手动关闭双频合一,精准掌控你的Wi-Fi网络
  • 3步轻松获取苹果苹方字体:让Windows系统拥有专业级中文字体体验