JavaScript的sessionStorage是什么?如何使用?

sessionstorage浏览器提供的临时存储机制,数据生命周期绑定当前标签页,关闭即清除。1.用于跨页面或刷新后保持临时数据,如多步骤表单暂存、spa状态管理;2.区别于localstorage,sessionstorage仅在当前会话有效且作用域限于当前标签页;3.使用时需注意:仅存储非敏感信息,防止xss攻击;处理容量限制,避免超限错误;遵守同源策略;手动序列化对象;避免滥用导致状态混乱。

JavaScript的sessionStorage是什么?如何使用?

JavaScript的sessionStorage,简单来说,就是浏览器提供的一种本地存储机制,它的数据生命周期与当前会话(或更准确地说,是当前浏览器标签页)紧密绑定。这意味着,只要你不关闭这个标签页或浏览器,数据就一直都在;一旦关闭,数据就会被清空。它不像localStorage那样永久保存,也不像cookie那样每次请求都自动发送到服务器,更不会有烦人的过期时间设置。它就是为“当前”这个时刻,这个具体标签页的临时数据而生。

JavaScript的sessionStorage是什么?如何使用?

解决方案

当我们需要在用户的当前浏览会话中,跨页面或在页面刷新后依然保持一些数据时,sessionStorage就显得特别有用。它属于Web Storage API的一部分,提供了一组非常直观的键值对存储接口。

使用起来,它的核心方法和localStorage几乎一模一样,非常友好:

立即学习“Java免费学习笔记(深入)”;

JavaScript的sessionStorage是什么?如何使用?

存储数据:sessionStorage.setItem(key, value)

keyvalue 都必须是字符串。如果你想存储对象或数组,需要先用JSON.stringify()将其转换为JSON字符串。

// 存储一个字符串sessionStorage.setItem('username', 'Alice');// 存储一个对象const userSettings = { theme: 'dark', notifications: true };sessionStorage.setItem('settings', JSON.stringify(userSettings));

获取数据:sessionStorage.getItem(key)

JavaScript的sessionStorage是什么?如何使用?根据key获取对应的value。如果key不存在,返回null。获取到的值也是字符串,如果是之前用JSON.stringify()存储的对象,需要用JSON.parse()解析回来。

const username = sessionStorage.getItem('username'); // 'Alice'const settingsString = sessionStorage.getItem('settings');if (settingsString) {    const settings = JSON.parse(settingsString);    console.log(settings.theme); // 'dark'}

删除单个数据:sessionStorage.removeItem(key)

根据key删除对应的数据项。

sessionStorage.removeItem('username');

清空所有数据:sessionStorage.clear()

清除当前域下sessionStorage中的所有数据。这个操作要慎重,因为它会把所有东西都抹掉。

sessionStorage.clear();

获取存储项数量:sessionStorage.length

返回当前sessionStorage中存储的键值对数量。

const count = sessionStorage.length;

遍历所有存储项:sessionStorage.key(index)

通过索引获取对应的键名,然后可以再用getItem获取值。

for (let i = 0; i < sessionStorage.length; i++) {    const key = sessionStorage.key(i);    const value = sessionStorage.getItem(key);    console.log(`${key}: ${value}`);}

sessionStorage的数据是同源的,也就是说,只有来自同一个协议、域名和端口的页面才能访问彼此的sessionStorage数据。而且,每个浏览器标签页都有自己独立的sessionStorage实例,一个标签页的sessionStorage不会影响到另一个标签页。这其实是个非常重要的特性,保证了不同会话之间的隔离性。

sessionStoragelocalStorage有哪些核心区别?我该如何选择?

这两兄弟,sessionStoragelocalStorage,都是Web Storage API的成员,用起来感觉几乎一样,但它们的核心差异在于数据的“生命周期”。这就像是你在办公桌上放东西,有些东西是临时的,会议结束就收起来;有些东西是常驻的,你每天都要用。

核心区别:

数据生命周期:

sessionStorage 数据只在当前浏览器会话中有效。当你关闭浏览器标签页(或者浏览器本身),sessionStorage中的数据就会被清除。如果你在一个标签页打开了网站,然后又在新标签页打开了同一个网站,这两个标签页的sessionStorage是相互独立的,互不影响。localStorage 数据是永久性的,除非你手动清除,或者用户清除浏览器缓存,否则数据会一直存在。即使你关闭浏览器再重新打开,数据也还在那里。

作用域:

sessionStorage 作用域是当前标签页。每个标签页都有自己的sessionStorage实例,互不干扰。localStorage 作用域是整个浏览器。同一个域名下的所有标签页,共享同一个localStorage数据。

如何选择?

选择哪个,完全取决于你的数据需要“活”多久,以及它的“作用范围”是多大。

选择sessionStorage的场景:

临时表单数据保存: 用户填写到一半的表单,不小心刷新了页面,或者跳转到其他页面又返回,希望表单数据还在。这简直是sessionStorage的完美用例。单页应用(SPA)中的会话状态: 比如用户在某个模块的筛选条件、列表的滚动位置、或者某个组件的临时状态,这些只需要在当前浏览会话中保持,关闭标签页就无所谓了。临时性的用户偏好设置: 比如用户在当前会话中选择了某个主题模式,但并不希望这个选择被长期记住。防止重复提交: 在用户提交表单后,可以设置一个标记到sessionStorage,防止用户在短时间内重复提交。

选择localStorage的场景:

用户登录信息或Token: 用户登录后,通常希望下次打开浏览器还能保持登录状态。用户个性化设置: 比如网站主题、字体大小、语言偏好等,这些希望长期记住的设置。离线缓存数据: 某些不经常变动的数据,可以缓存到localStorage,减少网络请求,提升加载速度。用户浏览历史或足迹: 比如用户最近浏览过的商品列表。

我的经验是,如果数据仅仅是为了提升当前用户体验,或者在特定流程中需要临时传递,且不希望它在用户关闭页面后依然存在,那就果断选择sessionStorage。如果数据是用户永久性的配置,或者希望在用户下次访问时依然有效,那么localStorage才是你的首选。

在实际开发中,sessionStorage有哪些常见的应用场景?

sessionStorage虽然生命周期短,但正因如此,它在很多需要“临时性”数据存储的场景中,表现得非常出色,而且避免了localStorage可能带来的数据积累问题。

多步骤表单的数据暂存:想象一个注册流程,分了好几步,每一步用户填写一部分信息。如果用户在第三步不小心刷新了页面,或者中途需要去其他页面查个资料再回来,你总不希望他从头再填吧?这时,每完成一步,就把当前步骤的数据存入sessionStorage。当用户回到这个表单页面时,检查sessionStorage是否有数据,有就填充进去。这样,即使页面刷新或导航,用户体验也不会中断。

// 在表单输入框失去焦点时保存document.getElementById('step1_input').addEventListener('blur', function() {    sessionStorage.setItem('step1Data', this.value);});// 页面加载时恢复window.addEventListener('load', function() {    const savedData = sessionStorage.getItem('step1Data');    if (savedData) {        document.getElementById('step1_input').value = savedData;    }});

单页应用 (SPA) 中的视图状态管理:在React、Vue或Angular这类SPA框架中,页面切换通常不触发整页刷新。但如果你在某个列表页滚动到了底部,或者应用了复杂的筛选条件,然后跳转到详情页,再返回列表页时,你可能希望列表页的滚动位置和筛选条件依然保持。由于SPA的路由切换可能导致组件重新渲染,直接的JS变量会丢失,但sessionStorage可以作为一种轻量级的状态持久化方案。

// 保存滚动位置window.addEventListener('beforeunload', () => {    sessionStorage.setItem('scrollPos', window.scrollY);});// 恢复滚动位置window.addEventListener('load', () => {    const scrollPos = sessionStorage.getItem('scrollPos');    if (scrollPos) {        window.scrollTo(0, parseInt(scrollPos));        sessionStorage.removeItem('scrollPos'); // 用完就清掉,避免干扰其他会话    }});

防止重复提交:用户提交表单后,如果网络延迟或者用户手抖多点了几次提交按钮,可能会导致数据重复提交。一个简单的策略是,在第一次提交成功后,在sessionStorage中设置一个标记(比如sessionStorage.setItem('formSubmitted', 'true')),并在接下来的几秒内,如果再次点击提交,就检查这个标记,如果存在就阻止提交。这个标记只在当前会话有效,避免了长期存储的副作用。

临时性的用户偏好或A/B测试标记:有时候,你可能想在用户当前会话中,临时改变一些界面元素或功能,比如进行A/B测试。你可以根据用户第一次访问时随机分配的A/B组,将结果存储在sessionStorage中,确保用户在当前会话中始终看到同一个测试版本,而不会因为刷新页面而切换。这比用cookie更简洁,且不会发送到服务器。

这些场景都体现了sessionStorage“短暂且专一”的特点,它只关心当前这个标签页,当前这个会话的数据,一旦任务完成或会话结束,数据就随风而逝,不留痕迹,这正是它价值所在。

使用sessionStorage时,有哪些需要注意的安全问题和最佳实践?

虽然sessionStorage用起来很方便,但它毕竟是客户端存储,有些方面还是需要我们多留心,避免踩坑。

安全性考量:切勿存储敏感信息!这是最重要的一点。sessionStorage中的数据是完全暴露在客户端的,任何通过浏览器开发者工具都能轻易查看和修改。更糟糕的是,如果你的网站存在XSS(跨站脚本攻击)漏洞,恶意脚本可以轻而易举地读取、修改甚至删除sessionStorage中的所有数据。所以,像用户的密码、银行卡号、个人身份信息等任何敏感数据,绝对不能明文存储在sessionStorage中。即使是加密后存储,也要极其谨慎,因为密钥通常也在客户端,容易被逆向工程。

容量限制:sessionStorage的存储容量通常在5MB到10MB之间,这取决于不同的浏览器。虽然比cookie的4KB大很多,但如果你尝试存储非常大的数据,比如图片二进制数据或者大型JSON对象,很可能会超出限制,导致写入失败并抛出错误。所以,在使用setItem时,最好用try...catch块包裹起来,以优雅地处理可能的存储失败。

try {    sessionStorage.setItem('largeData', JSON.stringify(someVeryLargeObject));} catch (e) {    if (e.name === 'QuotaExceededError') {        console.error('SessionStorage 容量超出限制!', e);        // 提示用户或采取其他降级措施    } else {        console.error('存储数据时发生未知错误:', e);    }}

同源策略:sessionStorage严格遵守同源策略(Same-Origin Policy)。这意味着只有来自相同协议、域名和端口的页面才能访问彼此的sessionStorage。这是浏览器提供的一道安全屏障,防止恶意网站窃取你网站的数据。你不需要为此额外做什么,但了解这一点可以帮助你理解为何在某些跨域场景下无法访问sessionStorage

多标签页独立性:我们之前提过,每个标签页的sessionStorage都是独立的。这既是优点,也可能是需要注意的地方。如果你期望用户在不同标签页之间共享某些临时状态,sessionStorage就无法满足了,你需要考虑使用localStorage或者更复杂的跨标签页通信机制(如BroadcastChannel API)。

数据类型处理:sessionStorage只能存储字符串。如果你想存储JavaScript对象、数组、数字或布尔值,你必须手动进行序列化(JSON.stringify())和反序列化(JSON.parse())。忘记这一步会导致你存储的数据变成[object Object]或字符串化的数字,而不是你期望的类型。

// 错误示范:直接存储对象sessionStorage.setItem('myObject', { a: 1, b: 2 }); // 实际存储的是 "[object Object]"// 正确做法:序列化sessionStorage.setItem('myObject', JSON.stringify({ a: 1, b: 2 }));const retrievedObject = JSON.parse(sessionStorage.getItem('myObject'));console.log(retrievedObject.a); // 1

避免滥用:虽然方便,但不要把sessionStorage当成万能的临时数据库。只存储那些真正需要跨页面或刷新后短暂保留的数据。过度使用或存储不必要的数据,不仅可能触及容量上限,也可能让你的应用状态管理变得混乱。保持数据的精简和目的性,是任何存储策略的最佳实践。

总结来说,sessionStorage是一个强大且实用的工具,尤其适用于管理会话级别的临时数据。但前提是你清楚它的限制、安全边界,并遵循一些基本的最佳实践。它不是万金油,但用对了地方,能极大地提升用户体验和开发效率。

以上就是JavaScript的sessionStorage是什么?如何使用?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1510096.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 05:47:00
下一篇 2025年12月20日 05:47:05

相关推荐

  • 如何使用 vue-color 创建交互式颜色渐变页面?

    如何创建交互式颜色渐变页面? 实现交互式颜色渐变页面可以通过利用第三方库来简化开发流程。 推荐解决方案: vue-color 立即学习“前端免费学习笔记(深入)”; vue-color是一个vue.js库,提供了一个功能强大的调色板组件。它允许你轻松创建和管理颜色渐变。 特性: 颜色选择器:选择单一…

    2025年12月24日
    200
  • 为什么自定义样式表在 Safari 中访问百度页面时无法生效?

    自定义样式表在 safari 中失效的原因 用户尝试在 safari 偏好设置中添加自定义样式表,代码如下: body { background-image: url(“/users/luxury/desktop/wallhaven-o5762l.png”) !important;} 测试后发现,在…

    2025年12月24日
    000
  • 如何利用 vue-color 库打造交互式色彩渐变页面?

    打造交互性前端:色彩渐变页面的制作方法 在前端开发中,色彩渐变页面和交互式元素深受设计师和开发人员的欢迎。本文将探讨如何利用 vue-color 库轻松实现这样的页面。 使用 vue-color 库构建调色板 vue-color 是一个 vue.js 库,可用于创建可定制的调色板。其基本功能包括: …

    2025年12月24日
    300
  • 如何使用前端技术创建交互式颜色渐变页面?

    如何创建交互式颜色渐变页面? 当您希望在前端界面实现颜色渐变效果并实现交互功能时,可以使用以下方法: 解决方案: 1. 使用 vue-color 库 vue-color 库是一个功能强大的 vue.js 库,可用于创建色板和处理颜色操作。它可以帮助您轻松实现颜色渐变效果,如下所示: 立即学习“前端免…

    好文分享 2025年12月24日
    000
  • Vue 中如何动态添加带有动态样式的伪元素?

    vue 动态添加具有动态样式的伪元素 在某些情况下,需要根据动态条件向 dom 元素添加带有动态样式的伪元素。例如,元素的伪元素“before”可能只有在满足特定条件时才会出现,并且其样式(如长度、高度和其他属性)也是不确定的。 解决方案:css 变量 由于伪元素的样式不能直接在 css 中定义,可…

    2025年12月24日
    000
  • 如何在网页 F12 调试中查看鼠标悬停时才出现的 DOM 元素?

    如何在网页 f12 调试中查看鼠标悬停时才出现的 dom 元素? 在 f12 调试模式下,鼠标悬停时才出现的 dom 元素无法通过直接选择查看。解决方法根据显示原理的不同而有所区别: 1. css 控制的元素 强制开启悬停状态:在 firefox 浏览器中,可以通过在开发者工具中手动开启选中元素的 …

    2025年12月24日 好文分享
    100
  • Vue 中如何动态添加伪元素?

    vue中如何动态添加伪元素 在某些情况下,需要动态地为元素添加伪元素,但传统方法受限于伪元素不能写死在 css 中。本文将介绍一种使用 css 变量解决此问题的方法。 使用 css 变量 css 变量允许在样式表中定义可重复使用的变量,然后可以在其他样式中使用这些变量。利用这个特性,我们可以动态地控…

    2025年12月24日
    100
  • 如何使用 CSS 变量动态控制 Vue 应用中 DOM 伪元素的样式?

    灵活操纵 vue 中 dom 伪元素 在 vue 应用中,有时需要在特定条件下动态添加和修改伪元素样式。虽然 css 中的伪元素通常是静态定义的,但有些情况下,需要根据用户的行为或数据动态调整其样式。 动态控制伪元素样式 可以使用 css 变量来解决此问题。css 变量允许您在样式表中存储可变值,然…

    2025年12月24日
    100
  • Vue中如何利用CSS变量动态操纵伪元素样式?

    利用css变量动态操纵伪元素 在vue中,有时需要动态地给dom元素添加伪元素,并且伪元素的样式也是动态变化的。不能在css文件中直接定义伪元素样式,因为伪元素包含动态参数。 这个问题的解决方法之一是使用css变量。css变量允许我们在css中定义变量并动态地将其分配给元素的样式。 代码示例: 立即…

    2025年12月24日
    300
  • HTMLrev 上的免费 HTML 网站模板

    HTMLrev 是唯一的人工策划的库专门专注于免费 HTML 模板,适用于由来自世界各地慷慨的模板创建者制作的网站、登陆页面、投资组合、博客、电子商务和管理仪表板世界。 这个人就是我自己 Devluc,我已经工作了 1 年多来构建、改进和更新这个很棒的免费资源。我自己就是一名模板制作者,所以我知道如…

    2025年12月24日
    300
  • Vue/UniApp 中如何实现选中效果的切换?

    vue/uniapp中复现选中的效果 在vue/uniapp中实现此效果,可以使用view元素和样式类来控制外观。让我们来看看这个问题的示例代码。 日 周 月 年 .tabs { display: flex; justify-content: space-between; flex-directio…

    2025年12月24日
    000
  • 如何简化五子棋代码中的重复部分?

    五子棋代码简化 问题: 如何简化五子棋代码中重复的部分? 问题内容: 提供了vue编写的五子棋代码,但其中有多个重复的部分。希望得到一个更简化的代码版本。 问题答案: 拆分重复方法 将大方法中的重复部分拆分成更小的函数,例如: placepiece():放置棋子checkandplace():检查某…

    2025年12月24日
    000
  • Vue/Uniapp 中如何实现类似图片所示的日周月年切换标签效果?

    vue/uniapp中,如何实现类似图片中效果的日周月年切换标签? 图片中呈现了四个标签,选中”日”后,背景变成蓝色,字体变成白色。而其他未选中的标签,背景为灰色,字体也呈灰色。 一位网友通过纯html实现了一个简易的版本,代码如下: 日 周 月 年 具体效果,可以点开上面的…

    2025年12月24日
    000
  • Vue/UniApp中如何制作圆角选项卡,且选中状态颜色与未选中状态颜色不同?

    vue/uniapp中,如何制作圆角栏目的选项卡效果? 你想要创建一个圆角栏目的选项卡效果,其中一个选中的选项是用白色文本填充蓝色背景,而其他选项是黑色文本填充灰色背景。 以下是使用html和css实现此效果的方法: 日 周 月 年 .tabs { display: flex; justify-co…

    2025年12月24日
    000
  • Vue2表格隐藏列后,固定列出现空白行怎么办?

    vue2表格隐藏列导致固定列空白行 当使用vue2表格库(例如element-table)时,隐藏其中一列可能会导致固定列(通常包含操作按钮)最上方出现空白行。 解决方案 要解决此问题,需要在切换列显示状态后手动调用dolayout()方法。该方法会重新计算表格的布局,消除空白行。 立即学习“前端免…

    2025年12月24日
    000
  • 如何优化 Vue 五子棋程序中的重复代码?

    简化代码 问题: 一个使用 vue 编写的五子棋程序中存在大量重复代码,需要进行简化。 代码重复: 立即学习“前端免费学习笔记(深入)”; 部分的 clickbox 函数中重复的条件检查和棋子放置逻辑。 部分的 aripoint 函数中重复的四种条件检查和棋子放置逻辑。 部分的 determinee…

    2025年12月24日
    100
  • Vue/UniApp 选项卡选中时如何添加边框和背景色?

    vue/uniapp中选中时有边框和背景色的选项卡如何实现 原帖中提供的代码不能实现选中时有边框和背景色的效果。下面是用 html 实现这种效果的代码: Document 日 周 月 年 .tabs { display: flex; justify-content: space-between; f…

    2025年12月24日
    000
  • 如何使用 Vue/Uniapp 实现美观实用的“选框”样式页面元素?

    vue/uniapp页面设计优化 在vue/uniapp中,为实现类似“选框”样式的页面元素,可采用以下优化方案: 创建层叠布局(flex layout): 设置外层容器的显示方式为“flex”,并启用水平排列。 定义“选框”元素: 立即学习“前端免费学习笔记(深入)”; 为每个“选框”创建一个子元…

    2025年12月24日
    000
  • 让我们只用一根安装线就可以使网络响应起来吗?我正在寻找贡献者!

    最近我发布了一个 npm 包,其使命如标题所示:让项目只需一行代码即可响应! 我与您分享响应式应用程序 [beta] 包 我花了几年时间尝试和开发这项技术,目前包括: 动态设置 html 标签字体大小(通过 js 脚本),考虑:(1) 屏幕分辨率和 (2) 浏览器字体大小(用于网络可访问性)将像素定…

    2025年12月24日
    000
  • 如何直接访问 Sass 地图变量的值?

    直接访问 sass 地图变量的值 在 sass 中,我们可以使用地图变量来存储一组键值对。而有时候,我们可能需要直接访问其中的某个值。 可以通过 map-get 函数直接从地图中获取特定的值。语法如下: map-get($map, $key) 其中: $map 是我们要获取值的 sass 地图变量。…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信