首页 web前端 js教程 Cookie、本地存储和会话存储

Cookie、本地存储和会话存储

Jan 05, 2025 pm 07:53 PM

Cookies, Local storage and Session storage

这是前端面试问题系列的第 6 篇文章。如果您希望提高准备水平或保持最新状态,请考虑注册前端训练营。


Cookie、本地存储和会话存储都用于在客户端存储数据。这些机制对于存储身份验证令牌或仅限客户端的状态(例如主题或个性化设置)特别有用。所有三种存储类型都具有以下特征:

  1. 它们将数据存储为键值对。
  2. 所有值都以字符串格式存储。如果值不是字符串,则会在存储之前对其进行序列化。
  3. 客户端可以访问存储在这些机制中的数据(HttpOnly cookie 除外)。

曲奇饼

Cookie 无法存储大量数据;每个域的存储上限约为 4KB。存在此限制是因为 cookie 会随着浏览器发出的每个请求自动发送到服务器。在 cookie 中存储过多的客户端数据会增加负载大小,从而对性能产生负面影响。

我们应该在 Cookie 中存储什么样的数据?
Cookie 非常适合存储需要传输到服务器的数据,例如身份验证令牌、会话 ID、分析 ID 和类似信息。此外,cookie 允许在同一域或子域的不同选项卡或窗口之间共享数据。

您可以使用各种标志来配置 cookie,以调整其行为或加强安全性:

  • HttpOnly 确保客户端无法通过 JavaScript 访问 cookie,从而降低 XSS 攻击的风险。
  • maxAge/expires 指定 cookie 的到期日期。如果未设置到期日期,则关闭浏览器时将删除 cookie。

想要了解有关 cookie 标志的更多信息吗?查看我的 LinkedIn 帖子。

与本地存储和会话存储不同,cookie 也可以由服务器使用 Set-Cookie 标头来设置(读取:“添加”)。

// Set a cookie for the key `token` that `expires` on 1st March 2025.
document.cookie =
  'token=a1-b2-c3; expires=Sat, 1 Mar 2025 23:59:59 GMT; path=/';

// Read all cookies. There's no way to read specific cookies using `document.cookie`.
// You have to parse the string yourself.
console.log(document.cookie); // token=a1-b2-c3

// Delete the cookie with the key `token` by setting an
// expiry date in the past. The value doesn't matter.
document.cookie = 'token=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/';

本地存储

与 cookie 不同,localStorage 提供更大的存储容量,每个域大约 5MB。这是因为 localStorage 是为存储长期数据而设计的。即使浏览器关闭,它也会保留数据,使其成为持久客户端存储需求的理想选择。

那么我们应该在localStorage中存储什么样的数据呢?
localStorage 最适合存储仅在客户端使用且不需要每次请求都发送到服务器的数据。一些示例是用户登录之前添加到购物车中的网站或产品的主题。

存储在 localStorage 中的数据将无限期地保留,直到用户手动删除它或网站使用 JavaScript 清除它。

与 cookie 类似,localStorage 中的数据可以在同源的所有选项卡或窗口中访问,这使得它对于在域内共享客户端状态非常有用。

// Set a cookie for the key `token` that `expires` on 1st March 2025.
document.cookie =
  'token=a1-b2-c3; expires=Sat, 1 Mar 2025 23:59:59 GMT; path=/';

// Read all cookies. There's no way to read specific cookies using `document.cookie`.
// You have to parse the string yourself.
console.log(document.cookie); // token=a1-b2-c3

// Delete the cookie with the key `token` by setting an
// expiry date in the past. The value doesn't matter.
document.cookie = 'token=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/';

会话存储

sessionStorage 用于存储短暂的客户端数据。与 localStorage 一样,它为每个域提供约 5MB 的存储容量,并共享相同的 API。

虽然 sessionStorage 和 localStorage 具有相似的功能,但它们在两个关键方面有所不同:数据持久性可访问性
与 localStorage 不同,一旦选项卡或浏览器关闭,sessionStorage 就不会保留数据。此外,存储在 sessionStorage 中的数据与创建它的特定选项卡或窗口隔离,这意味着来自同一来源的其他选项卡或窗口无法访问它。

那么 sessionStorage 的用例是什么?
sessionStorage 非常适合存储仅单个会话所需的数据。例如,假设用户填写了一份长表单,但意外刷新了页面。如果表单数据存储在 sessionStorage 中,它将在刷新过程中持续存在,从而允许用户继续操作而不会丢失进度。

但是,请务必注意,在其他选项卡中或关闭选项卡后将无法访问此数据。

// Set a value in localStorage.
localStorage.setItem('theme', 'dark');

// Get a value from localStorage.
console.log(localStorage.getItem('theme')); // 'dark'

// Remove a value from localStorage.
localStorage.removeItem('theme');

// Clear all data in localStorage.
localStorage.clear();

虽然cookie会自动包含在浏览器发送的每个请求中,但存储在localStorage或sessionStorage中的数据可以通过编写自定义代码手动传输到服务器。


概括

  1. Cookie、localStorage 和 sessionStorage 用于在客户端存储数据。
  2. Cookie 是唯一可以由服务器使用 Set-Cookie 响应标头进行设置的存储形式。
  3. Cookie 会随着每个请求自动发送到服务器。
  4. 与 cookie (4KB) 相比,localStorage 和 sessionStorage 的存储空间明显更大 (5MB)。这两个存储共享相同的 API 接口。
  5. Cookie 有有效期,如果没有有效期,它们会在浏览器关闭时被清除。
  6. localStorage 数据会无限期保留,除非由用户或网站本身手动清除。
  7. sessionStorage 数据在会话结束后(即选项卡或窗口关闭时)被清除。

喜欢你刚刚读到的内容吗?考虑看看前端训练营✌️

以上是Cookie、本地存储和会话存储的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Stock Market GPT

Stock Market GPT

人工智能驱动投资研究,做出更明智的决策

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

JavaScript实现点击图片切换效果:专业教程 JavaScript实现点击图片切换效果:专业教程 Sep 18, 2025 pm 01:03 PM

本文将介绍如何使用JavaScript实现点击图片切换的效果。核心思路是利用HTML5的data-*属性存储备用图片路径,并通过JavaScript监听点击事件,动态切换src属性,从而实现图片切换。本文将提供详细的代码示例和解释,帮助你理解和掌握这种常用的交互效果。

如何使用JavaScript中的GeOlocation API获取用户的位置? 如何使用JavaScript中的GeOlocation API获取用户的位置? Sep 21, 2025 am 06:19 AM

首先检查浏览器是否支持GeolocationAPI,若支持则调用getCurrentPosition()获取用户当前位置坐标,并通过成功回调获取纬度和经度值,同时提供错误回调处理权限被拒、位置不可用或超时等异常,还可传入配置选项以启用高精度、设置超时时间和缓存有效期,整个过程需用户授权并做好相应错误处理。

JavaScript中DOM元素访问的常见陷阱与解决方案 JavaScript中DOM元素访问的常见陷阱与解决方案 Sep 15, 2025 pm 01:24 PM

本文旨在解决JavaScript中通过document.getElementById()获取DOM元素时返回null的问题。核心在于理解脚本执行时机与DOM解析状态。通过正确放置标签或利用DOMContentLoaded事件,可以确保在元素可用时再尝试访问,从而有效避免此类错误。

NUXT 3组成API解释了 NUXT 3组成API解释了 Sep 20, 2025 am 03:00 AM

Nuxt3的CompositionAPI核心用法包括:1.definePageMeta用于定义页面元信息,如标题、布局和中间件,需在中直接调用,不可置于条件语句中;2.useHead用于管理页面头部标签,支持静态和响应式更新,需与definePageMeta配合实现SEO优化;3.useAsyncData用于安全地获取异步数据,自动处理loading和error状态,支持服务端和客户端数据获取控制;4.useFetch是useAsyncData与$fetch的封装,自动推断请求key,避免重复请

如何在JavaScript中创建多行字符串? 如何在JavaScript中创建多行字符串? Sep 20, 2025 am 06:11 AM

thebestatoreateamulti-linestlinginjavascriptsisisingsistisingtemplatalalswithbacktticks,whatpreserveticks,whatpreservereakeandeexactlyaswrite。

如何在JavaScript中使用setInterval创建重复间隔 如何在JavaScript中使用setInterval创建重复间隔 Sep 21, 2025 am 05:31 AM

要创建JavaScript中的重复间隔,需使用setInterval()函数,它会以指定毫秒数为间隔重复执行函数或代码块,例如setInterval(()=>{console.log("每2秒执行一次");},2000)会每隔2秒输出一次消息,直到通过clearInterval(intervalId)清除,实际应用中可用于更新时钟、轮询服务器等场景,但需注意最小延迟限制、函数执行时间影响,并在不再需要时及时清除间隔以避免内存泄漏,特别是在组件卸载或页面关闭前应清理,确保

JavaScript中数字格式化:使用toFixed()方法保留固定小数位 JavaScript中数字格式化:使用toFixed()方法保留固定小数位 Sep 16, 2025 am 11:57 AM

本教程详细讲解如何在JavaScript中将数字格式化为固定两位小数的字符串,即使是整数也能显示为"#.00"的形式。我们将重点介绍Number.prototype.toFixed()方法的使用,包括其语法、功能、示例代码以及需要注意的关键点,如其返回类型始终为字符串。

如何将文本复制到JavaScript中的剪贴板? 如何将文本复制到JavaScript中的剪贴板? Sep 18, 2025 am 03:50 AM

使用ClipboardAPI的writeText方法可复制文本到剪贴板,需在安全上下文和用户交互中调用,支持现代浏览器,旧版可用execCommand降级处理。

See all articles