深入理解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 论文精读【论文精读】…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
