热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cookie代码加时间多久出现一次_Cookie已凉,Web存储该这么做!

脚本之家你与百万开发者在一起本文经授权转自公众号CSDN(ID:CSDNnews)作者|浪里行舟责编|郭芮随着移动网络的发展与演化,我们手机上现在除了有

e853535d2756fae7044f1af58caa4394.png

脚本之家

你与百万开发者在一起

e853535d2756fae7044f1af58caa4394.png

16ce9f8b3e8f08d32d4ad76f24d51732.gif

本文经授权转自公众号CSDN

(ID:CSDNnews)

作者 | 浪里行舟

责编 | 郭芮

随着移动网络的发展与演化,我们手机上现在除了有原生 App,还能跑“WebApp”——它即开即用,用完即走。一个优秀的 WebApp 甚至可以拥有和原生 App 媲美的功能和体验。

WebApp 优异的性能表现,有一部分原因要归功于浏览器存储技术的提升。COOKIE存储数据的功能已经很难满足开发所需,逐渐被WebStorage、IndexedDB所取代,本文将介绍这几种存储方式的差异和优缺点。

1

COOKIE

1、COOKIE的来源

COOKIE 的本职工作并非本地存储,而是“维持状态”。因为HTTP协议是无状态的,HTTP协议自身不对请求和响应之间的通信状态进行保存,通俗来说,服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。

在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么,于是就诞生了COOKIE。它就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取COOKIEs中包含信息,借此维护用户跟服务器会话中的状态。

我们可以把COOKIE 理解为一个存储在浏览器里的一个小小的文本文件,它附着在 HTTP 请求上,在浏览器和服务器之间“飞来飞去”。它可以携带用户信息,当服务器检查 COOKIE 的时候,便可以获取到客户端的状态。

在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段COOKIE,记录着那项商品的信息。当用户访问另一个页面,浏览器会把COOKIE发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段COOKIE里追加新的商品信息。结帐时,服务器读取发送来的COOKIE就行了。

2、什么是COOKIE及应用场景?

COOKIE指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。 COOKIE是服务端生成,客户端进行维护和存储。通过COOKIE,可以让服务器知道请求是来源哪个客户端,就可以进行客户端状态的维护,比如登陆后刷新,请求头就会携带登陆时response header中的set-COOKIE,Web服务器接到请求时也能读出COOKIE的值,根据COOKIE值的内容就可以判断和恢复一些用户的信息状态。

3fc0c3fca7a8bda0c1b288abab22b4ba.png

如上图所示,COOKIE 以键值对的形式存在

典型的应用场景有:

  • 记住密码,下次自动登录;

  • 购物车功能;

  • 记录用户浏览数据,进行商品(广告)推荐。

3、COOKIE的原理及生成方式

COOKIE的原理:

54e4ec686e467c251b3bae3666c57898.png

第一次访问网站的时候,浏览器发出请求,服务器响应请求后,会在响应头里面添加一个Set-COOKIE选项,将COOKIE放入到响应请求中,在浏览器第二次发请求的时候,会通过COOKIE请求头部将COOKIE信息发送给服务器,服务端会辨别用户身份,另外,COOKIE的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。

COOKIE的生成方式主要有两种:

  • 生成方式一:http response header中的set-COOKIE

我们可以通过响应头里的 Set-COOKIE 指定要存储的 COOKIE 值。默认情况下,domain 被设置为设置 COOKIE 页面的主机名,我们也可以手动设置 domain 的值。

Set-COOKIE: 

当COOKIE的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。

  • 生成方式二:js中可以通过document.COOKIE可以读写COOKIE,以键值对的形式展示

例如我们在掘金社区控制台输入以下三句代码,便可以在Chrome 的 Application 面板查看生成的COOKIE:

document.COOKIE=

document.COOKIE=

document.COOKIE=

e6f1b45caa6d3bd4eee2506baf946033.png

从上图中我们可以得出:

Domain 标识指定了哪些域名可以接受COOKIE。如果没有设置domain,就会自动绑定到执行语句的当前域。 如果设置为”.baidu.com”,则所有以”baidu.com”结尾的域名都可以访问该COOKIE,所以在掘金社区上读取不到第三条代码存储COOKIE值。

4、COOKIE的缺陷

  • COOKIE 不够大

COOKIE的大小限制在4KB左右,对于复杂的存储需求来说是不够用的。当 COOKIE 超过 4KB 时,它将面临被裁切的命运。这样看来,COOKIE 只能用来存取少量的信息。此外很多浏览器对一个站点的COOKIE个数也是有限制的。

这里需注意:各浏览器的COOKIE每一个name=value的value值大概在4k,所以4k并不是一个域名下所有的COOKIE共享的,而是一个name的大小。

  • 过多的 COOKIE 会带来巨大的性能浪费

COOKIE 是紧跟域名的。同一个域名下的所有请求,都会携带 COOKIE。大家试想,如果我们此刻仅仅是请求一张图片或者一个 CSS 文件,我们也要携带一个 COOKIE 跑来跑去(关键是 COOKIE 里存储的信息并不需要),这是一件多么劳民伤财的事情。COOKIE 虽然小,请求却可以有很多,随着请求的叠加,这样的不必要的 COOKIE 带来的开销将是无法想象的。

COOKIE是用来维护用户信息的,而域名(domain)下所有请求都会携带COOKIE,但对于静态文件的请求,携带COOKIE信息根本没有用,此时可以通过cdn(存储静态文件的)的域名和主站的域名分开来解决。 - 由于在HTTP请求中的COOKIE是明文传递的,所以安全性成问题,除非用HTTPS。

5、COOKIE与安全

HttpOnly 不支持读写,浏览器不允许脚本操作document.COOKIE去更改COOKIE, 所以为避免跨域脚本 (XSS) 攻击,通过Javascript的 Document.COOKIE API无法访问带有 HttpOnly 标记的COOKIE,它们只应该发送给服务端。如果包含服务端 Session 信息的 COOKIE 不想被客户端 Javascript 脚本调用,那么就应该为其设置 HttpOnly 标记。

Set-COOKIE: 

标记为 Secure 的COOKIE只应通过被HTTPS协议加密过的请求发送给服务端。但即便设置了 Secure 标记,敏感信息也不应该通过COOKIE传输,因为COOKIE有其固有的不安全性,Secure 标记也无法提供确实的安全保障。

为了弥补 COOKIE 的局限性,让“专业的人做专业的事情”,Web Storage 出现了。

HTML5中新增了本地存储的解决方案——Web Storage,它分成两类:sessionStorage和localStorage。这样有了WebStorage后,COOKIE能只做它应该做的事情了——作为客户端与服务器交互的通道,保持客户端状态。

2

LocalStorage

1、LocalStorage的特点

  • 保存的数据长期存在,下一次访问该网站的时候,网页可以直接读取以前保存的数据;

  • 大小为5M左右;

  • 仅在客户端使用,不和服务端进行通信;

  • 接口封装较好。

基于上面的特点,LocalStorage可以作为浏览器本地缓存方案,用来提升网页首屏渲染速度(根据第一请求返回时,将一些不变信息直接存储在本地)。

2、存入/读取数据

localStorage保存的数据,以“键值对”的形式存在。也就是说,每一项数据都有一个键名和对应的值。所有的数据都是以文本格式保存。 存入数据使用setItem方法。它接受两个参数,第一个是键名,第二个是保存的数据。 

localStorage.setItem(

读取数据使用getItem方法。它只有一个参数,就是键名。 

var valueLocal = localStorage.getItem(

具体步骤,请看下面的例子:


3、使用场景

LocalStorage在存储方面没有什么特别的限制,理论上 COOKIE 无法胜任的、可以用简单的键值对来存取的数据存储任务,都可以交给 LocalStorage 来做。

这里给大家举个例子,考虑到 LocalStorage 的特点之一是持久,有时我们更倾向于用它来存储一些内容稳定的资源。比如图片内容丰富的电商网站会用它来存储 Base64 格式的图片字符串:

0f2bd7976b7a66de26ee73d9bb41ebd4.png

3

sessionStorage

sessionStorage保存的数据用于浏览器的一次会话,当会话结束(通常是该窗口关闭),数据被清空;sessionStorage 特别的一点在于,即便是相同域名下的两个页面,只要它们不在同一个浏览器窗口中打开,那么它们的 sessionStorage 内容便无法共享;localStorage 在所有同源窗口中都是共享的;COOKIE也是在所有同源窗口中都是共享的。除了保存期限的长短不同,SessionStorage的属性和方法与LocalStorage完全一样。

1、sessionStorage的特点

  • 会话级别的浏览器存储;

  • 大小为5M左右;

  • 仅在客户端使用,不和服务端进行通信;

  • 接口封装较好。

基于上面的特点,sessionStorage 可以有效对表单信息进行维护,比如刷新时,表单信息不丢失。

2、使用场景

sessionStorage 更适合用来存储生命周期和它同步的会话级别的信息。这些信息只适用于当前会话,当你开启新的会话时,它也需要相应的更新或释放。比如微博的 sessionStorage就主要是存储你本次会话的浏览足迹:

a8b2b8c9fa6928c1fb4aba5beb1c4992.png

lasturl 对应的就是你上一次访问的 URL 地址,这个地址是即时的。当你切换 URL 时,它随之更新,当你关闭页面时,留着它也确实没有什么意义了,干脆释放吧。这样的数据用 sessionStorage 来处理再合适不过。

3、sessionStorage 、localStorage 和 COOKIE 之间的区别

  • 共同点:都是保存在浏览器端,且都遵循同源策略。

  • 不同点:在于生命周期与作用域的不同

作用域:localStorage只要在相同的协议、相同的主机名、相同的端口下,就能读取/修改到同一份localStorage数据。sessionStorage比localStorage更严苛一点,除了协议、主机名、端口外,还要求在同一窗口(也就是浏览器的标签页)下。

05150591faef30f8e4e5fa97eb1f94f7.png 

生命周期:localStorage 是持久化的本地存储,存储在其中的数据是永远不会过期的,使其消失的唯一办法是手动删除;而 sessionStorage 是临时性的本地存储,它是会话级别的存储,当会话结束(页面被关闭)时,存储内容也随之被释放。

f78fa3d222f778a3a1d3e7ba10dadcd3.png

Web Storage 是一个从定义到使用都非常简单的东西。它使用键值对的形式进行存储,这种模式有点类似于对象,却甚至连对象都不是——它只能存储字符串,要想得到对象,我们还需要先对字符串进行一轮解析。

说到底,Web Storage 是对 COOKIE 的拓展,它只能用于存储少量的简单数据。当遇到大规模的、结构复杂的数据时,Web Storage 也爱莫能助了。这时候我们就要清楚我们的终极大 boss——IndexedDB!

4

IndexedDB

IndexedDB 是一种低级API,用于客户端存储大量结构化数据(包括文件和blobs)。该API使用索引来实现对该数据的高性能搜索。IndexedDB 是一个运行在浏览器上的非关系型数据库。

既然是数据库了,那就不是 5M、10M 这样小打小闹级别了。理论上来说,IndexedDB 是没有存储上限的(一般来说不会小于 250M)。它不仅可以存储字符串,还可以存储二进制数据。

1、IndexedDB的特点

  • 键值对储存

IndexedDB 内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括 Javascript 对象。对象仓库中,数据以"键值对"的形式保存,每一个数据记录都有对应的主键,主键是独一无二的,不能有重复,否则会抛出一个错误。

  • 异步

IndexedDB 操作时不会锁死浏览器,用户依然可以进行其他操作,这与 LocalStorage 形成对比,后者的操作是同步的。异步设计是为了防止大量数据的读写,拖慢网页的表现。

  • 支持事务

IndexedDB 支持事务(transaction),这意味着一系列操作步骤之中,只要有一步失败,整个事务就都取消,数据库回滚到事务发生之前的状态,不存在只改写一部分数据的情况。

  • 同源限制

IndexedDB 受到同源限制,每一个数据库对应创建它的域名。网页只能访问自身域名下的数据库,而不能访问跨域的数据库。

  • 储存空间大

IndexedDB 的储存空间比 LocalStorage 大得多,一般来说不少于 250MB,甚至没有上限。

  • 支持二进制储存

IndexedDB 不仅可以储存字符串,还可以储存二进制数据(ArrayBuffer 对象和 Blob 对象)。

2、IndexedDB的常见操作

在IndexedDB大部分操作并不是我们常用的调用方法,返回结果的模式,而是请求——响应的模式。

  • 建立打开IndexedDB——window.indexedDB.open("testDB")

这条指令并不会返回一个DB对象的句柄,我们得到的是一个IDBOpenDBRequest对象,而我们希望得到的DB对象在其result属性中。

938f8f1eff59bdb62748e2a2c9794d81.png

除了result,IDBOpenDBRequest接口定义了几个重要属性:

  • onerror: 请求失败的回调函数句柄;

  • onsuccess:请求成功的回调函数句柄;

  • onupgradeneeded:请求数据库版本变化句柄。

控制台得到一个 IDBDatabase对象,这就是IndexedDB对象:

134f28bacb2437d79bf7676790b8e61b.png

  • 关闭IndexedDB:

function closeDB(db){

  • 删除IndexedDB:

function deleteDB(name) {

5

总结

正是浏览器存储、缓存技术的出现和发展,为我们的前端应用带来了无限的转机。近年来基于存储、缓存技术的第三方库层出不绝,此外还衍生出了 PWA 这样优秀的 Web 应用模型。

总结下本文几个核心观点:

  • COOKIE 的本职工作并非本地存储,而是“维持状态”;

  • Web Storage 是 HTML5 专门为浏览器存储而提供的数据存储机制,不与服务端发生通信;

  • IndexedDB 用于客户端存储大量结构化数据。

作者:浪里行舟,硕士研究生,专注于前端,运营有个人公众号前端工匠,致力于打造适合初中级工程师能够快速吸收的一系列优质文章。

声明:本文为CSDN技术头条专栏原创投稿,未经允许请勿转载。

本文转自公众号“CSDN”,ID:CSDNnews

End -

0ccf343f2a613422e2fae2e8d53e6c34.png

4a0f8c4d2487e4fcbd3782888e0d9c29.gif

● c113d9322cecb9e83412bb40c9eb8b7d.gif 书榜 | 计算机书籍(3.25-3.31)销售排行榜

● c113d9322cecb9e83412bb40c9eb8b7d.gif 脚本之家粉丝福利,请查看!

● c113d9322cecb9e83412bb40c9eb8b7d.gif 听说全世界都在跨考计算机??

● 5G 还未商用,6G 研究已开始?!

● 算法工程师必须要知道的8种常用算法思想

● 为什么那么多人用“ji32k7au4a83”作密码?

● 算法不扎实的程序员,每个都很慌(附学习书单)

●  暴露年龄系列!这些手机系统 你用过几个?

2fe42dd835923675b3c467f52a020159.gif

小贴士

返回 上一级 搜索“Java 女程序员 大数据 留言送书 运维 算法 Chrome 黑客 Python Javascript 人工智能 女朋友 MySQL 书籍 等关键词获取相关文章推荐。




推荐阅读
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • PHP输出缓冲控制Output Control系列函数详解【PHP】
    后端开发|php教程PHP,输出缓冲,Output,Control后端开发-php教程概述全景网页源码,vscode如何打开c,ubuntu强制解锁,sts启动tomcat慢,sq ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 找到JDK下载URL当然去官网找了。目前最新的1.8的下载URL(RPM)如下:http:download.oracle.comotn-pubjavajdk8u161-b122f3 ... [详细]
  • 一.常见基于身份识别进行反爬1通过headers字段来反爬headers中有很多字段,这些字段都有可能会被对方服务器拿过来进行判断是否为爬虫1.1通过headers中的User-A ... [详细]
  • Java大文件HTTP断点续传到服务器该怎么做?
    最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传。这里在简要归纳一下,方便记忆 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 图片复制到服务器 方向变了_双服务器热备更新配置文件步骤问题及解决方法
    本文介绍了在将图片复制到服务器并进行方向变换的过程中,双服务器热备更新配置文件所出现的问题及解决方法。通过停止所有服务、更新配置、重启服务等操作,可以避免数据中断和操作不规范导致的问题。同时还提到了注意事项,如Avimet版本的差异以及配置文件和批处理文件的存放路径等。通过严格执行切换步骤,可以成功进行更新操作。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
author-avatar
飞教书的粉红色
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有