描述一下cookies,sessionStorage和localStorage的区别?

news/2024/6/17 5:21:22

这里是修真院前端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析前端知识/技能,本篇分享的是:

【描述一下cookies,sessionStorage和localStorage的区别?】

1.背景介绍

SessionStorage, LocalStorage, Cookie这三者都可以被用来在浏览器端存储数据,而且都是字符串类型的键值对。 区别在于前两者属于WebStorage,创建它们的目的便于客户端存储数据。 而Cookie早在网景公司的浏览器中就开始支持,最初目的是为了保持HTTP的状态。

 

Cookie(也叫Web cookie或者浏览器Cookie)是服务器发送到用户浏览器并保存在浏览器上的一块数据, 它会在浏览器下一次发起请求时被携带并发送到服务器上。比较经典的,可以它用来确定两次请求是否来自于同一个浏 览器,从而能够确认和保持用户的登录状态。Cookie的使用使得基于无状态的HTTP协议上记录稳定的状态信息成为了可能。

localStorage 是 HTML5 标准中新加入的技术,它并不是什么划时代的新东西。 早在 IE 6 时代,就有一 个叫 userData 的东西用于本地存储,而当时考虑到浏览器兼容性, 更通用的方案是使用 Flash。而如今,localStorage 被大多数浏览器所支持,更多用他来存储数据。

sessionStorage 与 localStorage 的接口类似, 但保存数据的生命周期与 localStorage 不同。 做过后 端开发的同学应该知道 Session 这个词的意思, 直译过来是“会话”。 而 sessionStorage 是一个前端的概念, 它只 是可以将一部分数据在当前会话中保存下来, 刷新页面数据依旧存在。 但当页面关闭后,sessionStorage 中的数据就会被清空

2.知识剖析
在同一个页面中设置 Cookie,实际上是按从后往前的顺序进行的。如果要先删除一个 Cookie,再写入一 个 Cookie,则必须先写入语句,再写删除语句,否则会出现错误Cookie是面向路径的。缺省路径 (path) 属性时 ,Web 服务器页会自动传递当前路径给浏览器,指定路径强制服务器使用设置的路径。在一个目录页面里设置的 Cookie 在另一个目录的页面里是看不到的Cookie 必须在 HTML 文件的内容输出之前设置;不同的浏览器 对 Cookie 的处理不一致,使用时一定要考虑;客户端用户如果设置禁止 Cookie,则 Cookie 不能建立。并且在客户端, 一个浏览器能创建的 Cookie 数量最多为 300 个,并且每个不能超过 4KB,每个 Web 站点能设置的 Cookie 总数不能超过 20 个

cookie的设置以及发送过程分为以下四步:

客户端发送一个http请求到服务器端

服务器端发送一个http响应到客户端,其中包含Set-Cookie头部

客户端发送一个http请求到服务器端,其中包含Cookie头部

服务器端发送一个http响应到客户端

Storage类的相关成员

成员名 方法参数 描述
length 属性 获取存储数据的条数
key(n) n:索引值 根据索引值,返回键名
getItem(key) key:键名 根据键名,获取数据值
setItem(key,value) key:键名 value:键值 根据键名和键值设置数据项,如果键名已经存在,则覆盖值
removeItem(key) key:键名 根据键名删除一个数据项
clear() 无 清空当前的Storage对象
三者之间的区别对比:

特性 Cookie localStorage sessionStorage
特性 一般由服务器生成,可设置失效时间。如果在浏览器端生成Cookie,默认是关闭浏览器后失效 除非被清除,否则永久保存 仅在当前会话下有效,关闭页面或浏览器后被清除
存放数据大小 4K左右 一般为5MB
与服务器端通信 每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 仅在客户端(即浏览器)中保存,不参与和服务器的通信
易用性 需要程序员自己封装,源生的Cookie接口不友好 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持
3.常见问题
 

COOKIE是如何工作的?

 

4.解决方案
 

COOKIE是如何工作的?

 

Cookie可用于客户端数据的存储,在没有其它存储办法时,使用这种方式是可行的,但随着现在浏览器开始支持各种各样 
的存储方式而逐渐被废弃。 由于服务器指定Cookie以后浏览器的每次请求都会携带Cookie数据,这会带来额外的性能负 
担(尤其是在移动环境下)。 新的浏览器API已经允许开发者直接在本地存储数据,如可以使用Web storage API (本地 
存储和会话存储)和IndexedDB(索引数据库)。 

COOKIE主要用在以下三个方面:

会话状态管理(如用户登录状态、购物车) 
个性化设置(如用户自定义设置) 
浏览器行为跟踪(如跟踪分析用户行为)

5.编码实战
6.扩展思考
三者的用途差异?

例如:曾经使用 Cookie 来保存用户在电商网站的购物车信息,如今有了 localStorage,Cookie就退休了。还有像一些 网页游戏会产生一些本地数据,也使用LocalStorage。但如果需要拆分页面,会跳转多个子页面的时候,就需要用到sessionStorage。

COOKIE的缺陷

每个 HTTP 请求中都包含 Cookies,从而导致传输相同的数据减缓我们的 Web 应用程序。 
每个 HTTP 请求中都包含 Cookies,从而导致发送未加密的数据到互联网上,可能会导致数据泄露,虽然进行过加密,但是攻击者拿到cookie后仍然可以登录,因为难以识别是否为同一个用户在登陆。 
Cookies 只能存储有限的 4KB 数据,对于复杂的存储需求来说是不够用的。

7.参考文献
参考资料:https://www.cnblogs.com/zr123...

—— Cookie、session和localStorage、以及sessionStorage之间的区别

参考资料:https://www.cnblogs.com/minig...

—— JS 详解 Cookie、 LocalStorage 与 SessionStorage

 

8.更多讨论
 

如何优化cookie?

关于安全性的考虑?

9.互动提问
sessionStroage有哪些应用场景? 
答: 在不需要和服务器交互的场所,用来存储用户数据之类的,可以在路由页跳转的时候取出更改储存,减少调用接口的次数,减轻服务器压力。

用storage怎么来判断用户是否需要再登陆? 
答:可以用加密的方法存储,每次用户访问的时候可以取出调用服务器接口作为参数发送进行对比,存在账号密码就直接跳过登录页。

localStorage是否可以在同源窗口共享? 
答:同一浏览器的相同域名和端口的不同页面间可以共享相同的 localStorage,但是不同页面间无法共享sessionStorage的信息。


http://www.niftyadmin.cn/n/3566381.html

相关文章

VC6中,结构中有一个是CString类对象,还能通过Socket直接来发送这个结构体对象吗...

服务端:struct user{char name[20];char pwd[20];int userid;CString content;}; user curUser; curUser.userid367; strcpy(curUser.pwd,"1234567"); strcpy(curUser.name,"张慧"); curUser.content"个人爱好为好吃懒做"; //发送TCP数据 //int …

asp.net2.0 GridView 导出到 Excel

step 1: 在再这页的aspx文件<% Page Language"C#" AutoEventWireup"true" %>中加上EnableEventValidation"false"step 2:把这段代码加在cs 文件中public override void VerifyRenderingInServerForm(Control control) { // bas…

VC++数据类型转换大全

Cpp代码 int i 100; long l 2001; float f300.2; double d12345.119; char username[]"程佩君"; char temp[200]; char *buf; CString str; _variant_t v1; _bstr_t v2; int i 100; long l 2001; float f300.2; double d12345.119; char …

纯真IP数据库格式详解zt

摘要 网络上的IP数据库以纯真版的最为流行&#xff0c;LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础。不过关于其格式的文档却非常之少&#xff0c;后来终于在网上找到了一份文档&#xff0c;得以了解其内幕&#xff0c;不过那份文档寥寥数语&#xff0c;也是颇为耐心才读…

UVA 11040 Add bricks in the wall

https://vjudge.net/problem/UVA-11040 找规律 #include<cstdio> using namespace std; int a[10][10]; int main() {int T,d;scanf("%d",&T);while(T--){for(int i1;i<5;i)for(int j1;j<i;j)scanf("%d",&a[i*2-1][j*2-1]);for(int i3…

MySQL学习-------MySQL锁与事务

一、MySQL锁概述相对其他数据库而言&#xff0c;MySQL的锁机制比较简单&#xff0c;其最显著的特点是不同的存储引擎支持不同的锁机制。比如&#xff0c;MyISAM和MEMORY存储引擎采用的是表级锁&#xff08;table-level locking&#xff09;&#xff1b;BDB存储引擎采用的是页面…

vc6.0,生成所有机器均可运行的独立exe

菜单&#xff1a;工程/设置/Microsoft基础类库&#xff1a;使用MFC作为静态链接库 如果选择使用MFC作为共享的DLL&#xff0c;双击试图运行&#xff0c;会提示缺少几个文件。

Faith of The Heart(心的信念)

Faith of The Heart <<星际迷航---进取号>>主题曲 [ra]http://fance.net/tmp/enterprise.mp3[/ra] [urlhttp://fance.net/tmp/enterprise.mp3][colorred]点此下载[/color][/url] Faith of The Heart作词 Diane Warren作曲 Russell Watson Its been a long roadG…