深入理解Web存储机制:Cookie、SessionStorage与LocalStorage的区别
文章目录
- 前言
- 一、Cookie简介
- 二、SessionStorage简介
- 三、LocalStorage简介
- 四、三者之间的比较
- 五、最佳实践建议
- 结语
前言
随着Web应用程序变得越来越复杂,开发者需要更有效的办法来管理客户端数据。Cookie、SessionStorage和LocalStorage是三种常用的Web存储机制,每一种都有其独特的特性和应用场景。本文将深入探讨这三者的差异,并指导开发者如何选择最合适的方案。
一、Cookie简介
- 定义:Cookies是小型文本文件,通常由服务器生成并发送给浏览器,之后浏览器会将这些信息附带在后续请求中返回给服务器。
- 特点
- 生命周期:默认情况下,cookies会在用户关闭浏览器后过期,但可以通过设置
Expires
或Max-Age
属性来延长生命周期。 - 容量限制:每个域名下的cookie总大小一般不超过4KB。
HTTP头传输:每次HTTP请求都会携带cookie,可能影响性能。 - 安全性:支持
HttpOnly
(防止JavaScript访问)和Secure
标志(仅通过HTTPS协议发送)。
- 生命周期:默认情况下,cookies会在用户关闭浏览器后过期,但可以通过设置
- 适用场景:主要用于保持用户登录状态或跟踪用户的偏好设置等。
示例代码:设置和读取Cookies
<!-- HTML -->
<button id="set-cookie">Set Cookie</button>
<button id="get-cookie">Get Cookie</button>
<div id="cookie-output"></div><script>
document.getElementById('set-cookie').addEventListener('click', function() {// 设置一个名为 'user' 的 cookie,值为 'John Doe',有效期为7天document.cookie = "user=John Doe; max-age=" + (7 * 24 * 60 * 60);
});document.getElementById('get-cookie').addEventListener('click', function() {// 读取所有 cookies 并显示let cookies = document.cookie.split("; ");let output = document.getElementById("cookie-output");output.innerHTML = "";for (let cookie of cookies) {output.innerHTML += `<p>${cookie}</p>`;}
});
</script>
二、SessionStorage简介
- 定义:SessionStorage提供了一种在单个浏览器标签页或窗口内持久保存数据的方式,直到该页面被关闭为止。
- 特点
- 生命周期:数据只存在于当前会话期间,在同一浏览器窗口或标签页中有效,一旦关闭则丢失。
- 容量限制:通常比cookie大得多,大约5MB左右(具体取决于浏览器实现)。
- 不参与网络请求:不会自动附加到HTTP请求中,因此对性能没有负面影响。
- 适用场景:适合用于临时存储不需跨页面共享的数据,如购物车内容或者表单输入缓存。
示例代码:设置和读取SessionStorage
<!-- HTML -->
<button id="set-session">Set Session Storage</button>
<button id="get-session">Get Session Storage</button>
<div id="session-output"></div><script>
document.getElementById('set-session').addEventListener('click', function() {// 设置 sessionStorage 中的 'username' 键,值为 'Jane Smith'sessionStorage.setItem('username', 'Jane Smith');
});document.getElementById('get-session').addEventListener('click', function() {// 从 sessionStorage 中获取 'username' 的值并显示let username = sessionStorage.getItem('username');document.getElementById('session-output').innerHTML = `<p>Username: ${username}</p>`;
});
</script>
三、LocalStorage简介
- 定义:LocalStorage允许网站以键值对的形式在用户计算机上长期保存大量数据。
- 特点
- 生命周期:除非用户手动清除或程序调用相应API删除,否则数据将一直存在。
- 容量限制:同样较大,通常是5MB以上(不同浏览器有所不同)。
持久性:即使浏览器重启,数据依然保留。 - 不参与网络请求:与SessionStorage一样,不会随HTTP请求一起发送。
- 适用场景:适用于需要长期保存且不需要立即同步到服务器的数据,例如用户偏好设置、离线功能等。
示例代码:设置和读取LocalStorage
<!-- HTML -->
<button id="set-local">Set Local Storage</button>
<button id="get-local">Get Local Storage</button>
<div id="local-output"></div><script>
document.getElementById('set-local').addEventListener('click', function() {// 设置 localStorage 中的 'theme' 键,值为 'dark'localStorage.setItem('theme', 'dark');
});document.getElementById('get-local').addEventListener('click', function() {// 从 localStorage 中获取 'theme' 的值并显示let theme = localStorage.getItem('theme');document.getElementById('local-output').innerHTML = `<p>Theme: ${theme}</p>`;
});
</script>
四、三者之间的比较
特征 | Cookie | SessionStorage | LocalStorage |
---|---|---|---|
数据生命周期 | 可配置(短期至长期) | 单一会话期内 | 长期 |
数据容量 | 小(约4KB) | 中等(约5MB) | 大(约5MB+) |
是否参与HTTP请求 | 是 | 否 | 否 |
安全特性 | 支持HttpOnly和Secure | 无特别安全措施 | 无特别安全措施 |
五、最佳实践建议
- 选择合适的存储方式:根据数据的性质(是否需要跨页面/会话共享、是否需要发送给服务器等)来决定使用哪种存储机制。
- 注意隐私保护:避免在任何存储中保存敏感信息,尤其是未经加密的个人信息。
- 考虑兼容性和安全性:确保所选方法符合目标平台的要求,并采取必要的安全措施来保护用户数据。
结语
Cookie、SessionStorage和LocalStorage各有千秋,理解它们之间的差异对于构建高效、安全的Web应用至关重要。正确选择和使用这些技术,可以帮助我们更好地管理和利用客户端数据,提升用户体验。
相关文章:
深入理解Web存储机制:Cookie、SessionStorage与LocalStorage的区别
文章目录 前言一、Cookie简介二、SessionStorage简介三、LocalStorage简介四、三者之间的比较五、最佳实践建议结语 前言 随着Web应用程序变得越来越复杂,开发者需要更有效的办法来管理客户端数据。Cookie、SessionStorage和LocalStorage是三种常用的Web存储机制&a…...
SpringBoot之BeanDefinitionLoader类源码学习
该类的作用 Spring 框架中用于加载和解析 Bean 定义的工具类。它主要用于从不同的资源(如 XML 文件、注解、Java 配置类等)中读取 Bean 定义,并将这些定义注册到 Spring 的 BeanFactory 或 ApplicationContext 中 基本属性 //指定的资源pri…...

【芯片封测学习专栏 -- 2D | 2.5D | 3D 封装的区别和联系】
请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 Overview线键合(wire-bonding)封装FOWLP2D封装2.5D 封装硅通孔(TSV)硅中介层无TSV的2.5D 3D封装 Overview 我们先要了解一下&…...

从硬件设备看Linux
一、介绍 DM3730通过各种连接方式连接了各种设备,输入输出设备根据不同的类型大体可 以分为电源管理、用户输人、显示输出、图像采集、存储以及无线设备等。我们可以将DM 3730与这些设备的数据接口分为总线和单一的数据接口总线。总线的显著特点是单个总线上可以连…...

open3d+opencv实现矩形框裁剪点云操作(C++)
👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… 💫签名:面朝大海,春暖花开! open3dopencv实现矩形框裁剪点云操作(Cÿ…...
git 本地操作
一、git.vscode 撤回本地提交 要在Git中撤销本地的最后一次提交,可以使用以下命令: git reset --soft HEAD^ 这将会撤销最后一次的提交,但是保留工作区以及暂存区的内容,方便重新提交。 如果你想完全撤销最后一次提交…...
PL/SQL语言的文件操作
PL/SQL语言的文件操作 PL/SQL(Procedural Language/SQL)是Oracle公司开发的一种过程化扩展SQL的语言,广泛应用于Oracle数据库的开发和管理。PL/SQL不仅支持SQL指令,还支持过程化编程,例如条件控制、循环控制、异常处理…...
linux lsof 和 fuser命令介绍
lsof 和 fuser 是两个在 Linux 系统中用于查看文件占用情况的重要工具。它们都可以用于查看哪些进程正在使用某些文件、设备或端口。下面是这两个命令的介绍、举例和背景。 lsof (List Open Files) 命令介绍: lsof 命令用于列出当前系统中所有打开的文件以及与之相关的进程。它…...

[Python学习日记-76] 网络编程中的 socket 开发 —— 介绍、工作流程、socket 模块用法和函数介绍
[Python学习日记-76] 网络编程中的 socket 开发 —— 介绍、工作流程、socket 模块用法和函数介绍 简介 socket 介绍 socket 的工作流程及用法 简介 前面在[Python学习日记-75] 计算机基础与网络当中介绍了一大堆基础知识之后我们终于开始进入到网络编程的开发阶段了&#x…...

vue(七) vue进阶
目录 第一课:Vue方法、计算机属性及侦听器 一、数组变化侦测 方法1:变更方法 方法2:替换一个数组 例子:小Demo:合并两个数组 二、计算属性 1.基础(不推荐) 2.使用计算属性来完成案例 3.使用函数的方…...

[Transformer] The Structure of GPT, Generative Pretrained Transformer
The Structure of Generative Pretrained Transformer Reference: The Transformer architecture of GPT models How GPT Models Work...
Django Admin 自定义操作封装
1. 为什么需要封装? 在Django开发中,我们经常需要在Admin界面添加自定义操作按钮,以便管理员执行特定的任务。通过封装,我们可以: 减少重复代码统一管理自定义操作的逻辑提高代码的可维护性和可扩展性 © ivwdcwso (ID: u012172506)2. CustomActionMixin 的实现 让我…...

http和https有哪些不同
http和https有哪些不同 1.数据传输的安全性:http非加密,https加密 2.端口号:http默认80端口,https默认443端口 3.性能:http基于tcp三次握手建立连接,https在tcp三次握手后还有TLS协议的四次握手确认加密…...
PL/SQL语言的数据库交互
PL/SQL语言的数据库交互 引言 在当今的信息化时代,数据库管理系统(DBMS)在各行各业中扮演着至关重要的角色。为了高效地与数据库进行交互,许多程序员、数据库管理员和系统分析师选择使用PL/SQL(Procedural Language/…...

亿道三防丨三防笔记本是什么意思?和普通笔记本的优势在哪里?
三防笔记本是什么意思?和普通笔记本的优势在哪里? 在现代社会中,笔记本电脑已经成为人们工作和生活中不可或缺的一部分。然而,在一些特殊行业或环境中,普通笔记本电脑由于其脆弱性和对环境条件的敏感性,往…...
从项目代码看 React:State 和 Props 的区别及应用场景实例讲解
在 React 中,state 和 props 是组件的两个重要概念,它们有不同的作用和应用场景。理解它们之间的区别对于开发 React 应用至关重要。 1. state 和 props 的区别 props (属性): props 是由父组件传递给子组件的数据或函数。props 是只读的&am…...

Vue 学习之旅:核心技术学习总结与实战案例分享(vue指令下+计算属性+侦听器)
Vue 学习之旅:核心技术学习总结与实战案例分享 文章目录 Vue 学习之旅:核心技术学习总结与实战案例分享一、指令补充(一)指令修饰符(二)v-bind 对样式操作的增强(三)v-model 应用于其…...
freertos的基础(二)内存管理:堆和栈
1. 堆(Heap) 定义 堆是 FreeRTOS 中用于动态内存分配的内存区域。FreeRTOS 提供了多种堆管理方案(如 heap_1、heap_2、heap_4 等),开发者可以根据需求选择合适的内存管理策略。 作用 用于动态分配内存,例…...
vue \n 换行不不显示
Vue 中,直接使用包含 \n 的字符串进行渲染时,换行符不会被识别为 HTML 的换行,因为 Vue 默认会将其视为普通文本。 对此提供两种解决办法 方法一:使用 v-html 指令替换 \n 为 <br> <template><div v-html"…...

GPT 系列论文精读:从 GPT-1 到 GPT-4
学习 & 参考资料 前置文章 Transformer 论文精读 机器学习 —— 李宏毅老师的 B 站搬运视频 自监督式学习(四) - GPT的野望[DLHLP 2020] 來自猎人暗黑大陆的模型 GPT-3 论文逐段精读 —— 沐神的论文精读合集 GPT,GPT-2,GPT-3 论文精读【论文精读】…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...