浏览器缓存–cookie、sessionStorage、localStorage、indexedDB

cookie

最初用于在客户端存储会话信息

服务器在响应 HTTP 请求时,向客户端发送 Set-cookie HTTP头部包含会话信息,浏览器回存储这些会话信息(存在客户端本地),并且在之后同域名,而且符合 path 要求的每个请求中都会通过HTTP头部cookie将他发回服务器

Cookie的仅作用范围最主要由和 domain 域名和 path 路径限定,与协议和端口无关

会话存储

特定域绑定,设置cookie后,他会与请求一起发送到创建它的域

一些限制:每个域不超过20个cookie,浏览器不超过300个cookie,每个cookie不超过4096个字节……

的过期时间由客户端设置。若不设置过期时间,则表示这个 cookie`的生命期为浏览器会话期间,关闭浏览器窗口, cookie 就会消失

构成:

1)名称name:不分大小写,必须经过URL编码

2)值:存在cookie中的字符串值,这个值必须经过URL编码

3)域:发送到这个域的请求都会带上cookie

4)路径:请求路径包含这个路径才会把cookie发送到服务器

5)过期时间:表示合适删除cookie的时间戳,默认情况下浏览器会话结束就会删除所有cookie,不过也可以自己设置 一个过期时间,这样即使关闭浏览器,时间到了cookie也会被删除

6)安全标志:只有使用功能SSL安全链接的情况下才会把cookie发送到服务器

Set-Cookie:name=value,expires=Mon,22-Jan-07 07:10:24 GMT;domains=.wrox.com;secure

cookie叫做name的cookie,Mon,22-Jan-07 07:10:24过期,.wrox.com及其他子域携带cookie,SSL连接才随请求发送到服务器

实际上发送给服务器的只有cookie的 名/值 对

document.cookie  // 获取页面中所有有效的cookie字符串document.cookie=encodeURIComponent("name") + "=" + encodeURIComponent("Nicholas") + "; domain=.wrox.com;secure"  // 设置cookie

不要在cookie中存储重要或敏感信息

web Storage

只能存储字符串,所以非字符串需要转为字符串,最常用 JSON.stringify()

sessionStorage

会话存储机制

特点:

1》存储位置:将数据保存在session对象中

2》时效性:从进入网站到关闭窗口(从开始会话到结束会话)期间有效(临时保存);页面关闭消失,但是不受页面刷新影响

3》共享限制:前提是同源,同一个会话及这个会话的跳转,打开新页面(同一个会话,不受标签页的影响,路由切换也是没有关系,甚至windo.open开一个新页面,html变了也没有关系,单页面用得多一些);如果直接复制地址,新开一个标签页打开是没有的,只要当前会话打开或跳转一个同源的页面就能拿到

4》存储大小是由限制的,比cookie大,比localStorage小,5M左右

增删改查的api

// 获取
sessionStorage.getItem(key)
sessionStorage.key
// 添加设置、修改
sessionStorage.setItem(key,value)
sesisonStoreage.key=value
// 删除
sessionStorage.removeItem(key)
delete sessionStorage.key
sessionStorage.clear()

注意事项:理论上是同源就共享,但也可能出现没有共享的情况

1》使用window.open()打开同源url,sessionStorage仍然共享

      window.open("http://localhost:8080/index.html");

2》a标签打开新页面

    <a href="http://localhost:8080/echart.html" target="_blank"a标签打开新页面</a>

发现新开的页面,sessionStorage并没能共享过来

解决方法:加上 rel=“opener”

    <a href="http://localhost:8080/index.html" target="_blank" rel="opener">打开新的tab标签页</a>

rel:规定当前文档与目标 URL 之间的关系。仅在 href 属性存在时使用

3》如果你直接打开一个同源新的tab页面,就算是同源也是无法共享sessionStorage

即使是同一个地址,同一个路由都不行

4》使用vue-router跳转,当前页面内部的跳转肯定可以共享

localStorage

永久存储机制

特点:

1》存储位置:将数据保存在客户端本地硬件设备中(通常指硬盘,也可以时其他应键设备中)

2》时效性:浏览器关闭,改数据依然存在(永久保存)设置手动清除才清除

3》共享限制:前提是同源,不同标签页、不同窗口可以访问,但是跨域和跨浏览器不能访问到(也就是在打开页面之后对当前标签页的数据进行一些增删改,同浏览器同源的数据都会发生变化)

4》存储大小相对来说比较大

增删改查的api

// 获取
localStorage.getItem(key)
localStorage.key
// 添加设置、修改
localStorage.setItem(key,value)
localStorage.key=value
// 删除
localStorage.removeItem(key)
delete localStorage.key
localStorage.clear()

监视storage中的数据

存储事件storage,每次使用setItem delete removeItem clear 都会触发这个事件

window.addEventListener("storage",e=>{
console.log("存储变化对应的域:", e.domain,"被设置或删除的值:",e.key,
"键被设置的新值 删除为null", e.newValue, 键变化之前的值 e.oldValue)
})

同源同浏览器同窗口,打开两个标签页,修改一个的localStorage,另一个就能监听到变化

      window.addEventListener('storage',event => {console.log('监听到localStorage中的值发生了变化')console.log(event) //常用的属性event.key event.url event.newValue event.oldValue},false)document.querySelector('#btn').addEventListener('click', () => {localStorage.setItem('test', '72变')})

修改setItem方法,让本页面能够监听到变化(其他页面监听不到)

      var orignalSetItem = localStorage.setItemlocalStorage.setItem = function(key, newValue) {var setItemEvent = new Event('setItemEvent')setItemEvent.newValue = newValuewindow.dispatchEvent(setItemEvent)orignalSetItem.apply(this, arguments)}window.addEventListener('setItemEvent', function(e) {alert(e.newValue)})document.querySelector('#btn').addEventListener('click', () => {localStorage.setItem('test', 'samePage')})

cookie、sessionStorage、localStorage三者对比

不同点

cookie

1 存储数量据小
2 在设置的期限到达之前有效,及时关闭浏览器*
3 在同一浏览器的所有同域名且路径符合要求的窗口共享 (前提是cookie的domain、path、ssl 满足要求),即使页面不同也可以拿到;不同浏览器安全问题肯定是不能共享啦
4 cookie数据始终在符合要求的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递

sessionStorage
1 存储数据量较大
2 当前浏览器关闭之前有效
3 只在当前浏览器的当前会话共享 ,即使是同一浏览器,不同会话也不能共享cookie
4 sessionStorage不会自动把数据发送给服务器,仅在本地保存

localStorage
1 存储数据量大
2 除非自己删除,否则一直有效,即使浏览器关闭
3 在当前浏览器所有同源窗口共享*
4 localStorage不会自动把数据发送给服务器,仅在本地保存

相同点

都可以用来存储数据,且都保存在客户端(浏览器)

IndexedDB

结构化数据存储机制

IndexedDB设计几乎完全是异步的,所以大多操作以请求的形式执行

与传统数据库不同的是,使用对象存储而不是表格保存数据

浏览器可能对indexDB有50M大小的限制

1、使用indexedDB.open打开数据库,建立连接

let db,request,version=1
request=indexedDB.open("admin",version) // 版本为整数
request.onerror=event=>console.log("失败",event.target.errorCode)
request.onsuccess=event=>db=event.target.result

2、存储对象数据

request.onupgradeneeded=event=>{
const db=event.target.resultif(db.bojectStoreNames.contains("users")){db.deleteObjectStore("users")}
db.createObjectSyore("users",{keyPath:"username"})
}

3、通过事物操作数据

let transaction=db.transaction("users")
transaction.onerror=e=>console.log(e)
transaction.onsuccess=e=>console.log(e)

浏览器缓存--cookie、sessionStorage、localStorage、indexedDB相关推荐

  1. html输入框不显示cookie_jquery设置浏览器缓存cookie提示内容显示隐藏

    特效描述:设置浏览器缓存 cookie提示 内容显示隐藏,jquery制作通过判断各种浏览器版本等,来设置各个浏览器缓存cookie,控制模块内容或区域在浏览器缓存cookie的情况下,是否显示或隐藏 ...

  2. 浏览器存储(cookie、localStorage、sessionStorage)

    区别 cookie在浏览器请求中每次都会附加请求头中发送给服务器.用户代理(一般值浏览器)所实现的大小最少要到达4096字节(感谢@lulianqi15的指正) localStorage保存数据会一直 ...

  3. session,cookie,sessionStorage,localStorage的区别及应用场景

    浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...

  4. 浅谈session,cookie,sessionStorage,localStorage的区别及应用场景

    浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...

  5. http缓存和浏览器缓存

    一.前言 前端缓存主要是分为HTTP缓存和浏览器缓存.其中HTTP缓存是在HTTP请求传输时用到的缓存,主要在服务器代码上设置:而浏览器缓存则主要由前端开发在前端js上进行设置. 缓存可以说是性能优化 ...

  6. 浏览器缓存 JavaScript 操作

    本文同步发布于 https://molmin.github.io/blog/article?id=8438923900934a8515d616227fe51093. 打开开发者工具窗口,可以看到如下界 ...

  7. 前端缓存(浏览器缓存和http缓存)详解

    web缓存是高级前端工程师必修技能.是我们变成大牛过程中绕不开的知识点. 文章会尽量用通俗易懂的言语来细说web缓存的概念和用处. 本期文章的大纲是 什么是web缓存(前端缓存) 缓存可以解决什么问题 ...

  8. 浏览器缓存 HTTP缓存-CDN缓存-localstorage/sessionstorage/cookie

    文章目录 浏览器缓存 面试题 概述 HTTP缓存 -提高二次请求响应速度 HTTP的缓存控制,如何设置缓存策略 CDN缓存 -提高首次请求资源的响应速度 CDN的核心功能 CDN的基本原理 local ...

  9. 前端学习:浏览器缓存方式有哪些(cookie、localstorage、sessionstorage)

    浏览器缓存有哪些 浏览器缓存的问题在后台项目中会经常出现,本期文章会总体介绍 浏览器缓存的几种方式 和 通常缓存的方式 .

最新文章

  1. rmd文件怎么转换html文件,提取.Rmd文件的html依赖项(包含htmlwidgets)
  2. groupby+(apply+agg+transform)方法的比较
  3. List for game to play latter
  4. Spring Boot发布2.6.2、2.5.8:升级log4j2到2.17.0
  5. Android应用开发:动画和Fragment
  6. nyoj-496-巡回赛--拓扑排序
  7. ImportError: No module named openid
  8. 【渝粤题库】陕西师范大学201981教育统计与测量 作业 (专升本、高起本)
  9. python从云端数据库获取数据失败_使用%s的Python MySQL Connector数据库查询失败
  10. openstack安装指南_6种管理OpenStack的新指南
  11. jQuery复制table header到表格的最下面
  12. java中常用的坑_Java技术开发中的坑
  13. java 类型推导_Java10类型推导
  14. 他曾一举击败英伟达,却因坚持研发背负骂名
  15. 深入理解 Laravel 管道
  16. STM32F1的PWM占空比调节
  17. tcl电视显示服务器异常1500,TCL 智能液晶电视常见故障分析检修实例
  18. Prometheus + Grafana 搭建监控报警系统
  19. html中的文本在指定位置换行
  20. 2019年最新最全香港5大银行开户条件及攻略

热门文章

  1. ROI Pooling 与 SPP 理解
  2. (视频+源码)助力年后跳槽:对标阿里P8的大数据开发全套教程
  3. KKB:Map、HashMap
  4. 层出不穷的终端设备适配需求下 未来的响应式Web设计长什么样?
  5. ie历史记录值不能触发onchange事件
  6. android应用更改系统语言,android app根据系统语言设置应用语言
  7. 电力系统导纳矩阵与短路计算matlab程序
  8. 文档图像倾斜角检测及校正(一)(Matlab)
  9. 中小企业如何提高品牌知名度?做好直播带货和短视频营销
  10. Android Studio 控制台中文乱码