当前位置: 首页 > news >正文

浏览器缓存:强缓存与协商缓存实现原理有哪些?

1、强缓存:设置缓存时间的,那么在这个时间内浏览器向服务器发送请求更新数据,但是服务器会让其从缓存中获取数据。
可参考:
彻底弄懂强缓存与协商缓存 - 简书

2、协商缓存每次都会向浏览器询问,那么是怎么询问的呢?

cache-control: no-cache,每次请求都回询问服务端,那么是如何询问?

当浏览器发送的请求中包含Cache-Control: no-cache时,意味着浏览器不希望使用本地缓存的副本,而是希望向服务器询问资源是否有更新。浏览器如何询问服务器是否有更新,这是通过HTTP协议的机制来实现的。

具体来说,服务器会通过以下几种方式来告诉浏览器是否有更新:

  1. ETag/If-None-Match: 服务器为每个资源分配一个唯一的ETag标识(Entity Tag)。如果下次请求时,客户端发送的If-None-Match头部包含之前服务器分配的ETag,则表示客户端想知道服务器自上次给予的ETag之后,资源是否有更新。

  2. Last-Modified/If-Modified-Since: 服务器在响应请求时,会通过Last-Modified头部告知资源的最后修改时间。如果下次请求时,客户端发送的If-Modified-Since头部包含之前服务器告知的最后修改时间,则表示客户端想知道自此时点之后,资源是否有更新。

  3. 200 OK with content: 如果服务器判定资源有更新或者是必须重新发送的,会响应200 OK状态码和新的资源内容。

  4. 304 Not Modified: 如果服务器判定资源自客户端上一次请求以来未更改,会响应304 Not Modified状态码,表示客户端可以继续使用本地缓存的副本。

以下是一个简单的HTTP请求和响应示例,展示了使用Cache-Control: no-cache时浏览器如何询问服务器资源是否有更新:

在这个例子中,请求中包含了If-None-MatchIf-Modified-Since头部,询问服务器资源自指定时间以来是否有更新。服务器根据这些头部以及资源的当前状态,如果有更新,则响应200 OK和新的资源内容;如果没有更新,则响应304 Not Modified,表示可以继续使用客户端的缓存副本。

相关文章:

  • HTTPS请求头缺少HttpOnly和Secure属性解决方案
  • 微服务实战系列之玩转Docker(二)
  • redis基本类型和订阅
  • 数据结构之初始二叉树(2)
  • docker网络互联
  • 机器学习-20-基于交互式web应用框架streamlit的基础使用教程
  • 企业如何查看员工的上网时长和记录?如何查看公司局域网员工电脑的上网记录
  • uniapp 开发 App 对接官方更新功能
  • 【Android】基础—基本布局
  • 校验el-table中表单项
  • Flink实时开发添加水印的案例分析
  • 【Qt】之【Bug】error:C1083 无法打开包括文件
  • 第七章 单片机的串行口
  • 小程序为什么要做分包处理
  • [Unity]碰撞器的接触捕获层详解
  • 4. 路由到控制器 - Laravel从零开始教程
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Bootstrap JS插件Alert源码分析
  • echarts的各种常用效果展示
  • Electron入门介绍
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java的Interrupt与线程中断
  • JSONP原理
  • Lucene解析 - 基本概念
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • node入门
  • Python连接Oracle
  • V4L2视频输入框架概述
  • XML已死 ?
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 解决iview多表头动态更改列元素发生的错误
  • 如何设计一个微型分布式架构?
  • 小程序测试方案初探
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • # Apache SeaTunnel 究竟是什么?
  • #Spring-boot高级
  • #预处理和函数的对比以及条件编译
  • (23)Linux的软硬连接
  • (52)只出现一次的数字III
  • (二)springcloud实战之config配置中心
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (正则)提取页面里的img标签
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转载)从 Java 代码到 Java 堆
  • (自用)交互协议设计——protobuf序列化
  • .NET BackgroundWorker
  • .NET Core 和 .NET Framework 中的 MEF2