详解浏览器HTTP强、协商缓存

私有缓存
私有缓存是绑定到特定客户端的缓存 —通常是浏览器缓存。由于存储的响应不与其他客户端共享,因此私有缓存可以存储该用户的个性化响应
Cache-Control: private

  • 个性化内容通常是由 cookie 控制,但是 cookie 的存在并不能表明他是私有的,因此单独的 cookie 不会使响应成为私有的。
  • 需要注意的是,如果响应具有 Authorization 标头,则不能将其存储在私有缓存(或共享缓存,除非 Cache-Control 指定的是 public)。
    共享缓存
    共享缓存位于客户端和服务端之间,可以存储能在用户之间共享的响应。共享缓存可以细分为代理缓存和托管缓存
    代理缓存
    除了访问控制的功能外,一些代理还实现了缓存以减少网络流量。这通常不由服务开发人员管理,必须恰当的HTTP标头控制
    Cache-Control: no-store, no-cache, max-age=0, must-revalidate, proxy-revalidate
    托管缓存
    托管缓存由服务人员明确部署,以降低源服务器负载并有效地交付内容。示例包括:反向代理、CDN、service worker 与缓存 API 的组合。
    • 大多数情况下,你可以通过 Cache-Control 标头和你自己的配置文件或仪表板来控制缓存的行为
    • HTTP 缓存规范本质上没有定义显式删除缓存的方法 — 但是使用托管缓存,可以通过仪表板操作、API 调用、重新启动等实时删除已经存储的响应。这允许更主动的缓存策略。
    • 也可以忽略HTTP 缓存闺房协议以支持显示操作。例如指定: Cache-Control: no-store 来退出私有缓存或代理缓存,同时使用你自己的策略尽在托管缓存中进行缓存。
    • 某些 CDN 提供自己的标头,这些仅对该CDN有效(如:Surrogate-Control )。目前正在努力定义一个 CDN-Cache-Control 标头来标准化这些标头
      启发式缓存
      HTTP 旨在尽可能多地缓存,因此即使没有给出 Cache-Control,如果满足某些条件,响应也会被存储和重用。这称为启发式缓存。
      启发式缓存是在 Cache-Control 被广泛采用之前出现的一种解决方法(未指定过期时间,客户端尝试性地重用数据,时间约为修改前至今的 10%的时间),基本上所有响应都应明确指定 Cache-Control 标头。
      基于 age 的缓存策略
      存储的 HTTP 响应有两种状态: fresh 和 stale 。fresh状态通常表示响应仍然有效,可以重用。而 stale 状态表示缓存的响应已经过期。
      确定响应何时是 fresh 的和何时是 stale 的标准是 age。在 HTTP 中,age 是自响应生成以来经过的时间。
      HTTP/1.1 200 OK
      Content-Type: text/html
      Content-Length: 1024
      Date: Tue, 22 Feb 2022 22:22:22 GMT
      Cache-Control: max-age=604800

<!doctype html>

存储示例响应的缓存会计算响应生成后经过的时间,并将结果用作响应的 age。
对于该示例的响应,max-age 的含义如下:
如果响应的 age 小于一周,则响应为 fresh。
如果响应的 age 超过一周,则响应为 stale。
只要存储的响应保持有效(fresh),它将用于兑现客户端请求。
Expires 或 max-age
1. 在HTTP/1.0 中,有效期是通过 Expires 标头来指定的。
Expires 标头使用明确的时间来缓存生命周期
Expires: Tue, 28 Feb 2022 22:22:22 GMT
但是时间格式难以解析,也有可能通过故意偏移系统时钟来诱发问题,一般不使用
2. 在HTTP/1.1 中,Cache-Control 采用了 max-age —用于指定经过的时间
若Expires 和 Cache-Control: max-age 都可用,则将 max-age 定义为首选
验证响应
验证即为协商缓存:使用包含 If-Modified-Since 或 If-None-Match 请求标头的条件请求完成的。
强制验证:
1. Cache-Control: no-cache
2. Cache-Control: max-age=0, must-revalidate
max-age=0意味着立即过时,must-revalidate意味着一旦过时不得在没有重新验证的情况下重用它。
no-cache 指令不会阻止响应的存储,而是阻止在没有重新验证的情况下重用响应。
不使用缓存
Cache-Control: no-store
No-store 指令会禁止响应存储在任何缓存中
不与其他用户共享
Cache-Control: private;
重新加载、强制重新加载 与 避免重新验证
1. 重新加载
GET / HTTP/1.1
Host: example.com
Cache-Control: max-age=0
If-None-Match: “deadbeef”
If-Modified-Since: Tue, 22 Feb 2022 20:20:20 GMT

// 注意:“reload”不是正常重新加载的正确模式;“no-cache”才是
fetch(“/”, { cache: “no-cache” });
2. 强制重新加载
GET / HTTP/1.1
Host: example.com
Pragma: no-cache
Cache-Control: no-cache

Fetch标准
// 注意:“reload”——而不是“no-cache”——是“强制重新加载”的正确模式
fetch(“/”, { cache: “reload” });
3. 避免重新验证
1. 永远不会改变的内容应该被赋予一个较长的 max-age,方法是使用缓存破坏——也就是说,在请求 URL 中包含版本号、哈希值等。
2. immutable 指令可用于明确指示不需要重新验证,因为内容永远不会改变。
Cache-Control: max-age=31536000, immutable
删除存储的响应
- 基本没有办法删除用很长的 max-age 存储的响应。
- 由于缓存,不再有请求到达服务器!
- 规范中提到的方法之一是使用不安全的方法(例如:POST)发送对同一URL对请求,但对于许多客户端而言,通常很难故意这样做
- 有一个 Clear-Site-Data: cache 标头和值的规范,但并非全部浏览器都支持。—即使使用它,他也只会影响浏览器缓存,而不会影响中间缓存。
- 除非用户手动执行重新加载、强制重新加载或清除历史操作,否则存储的响应都将保留其 max-age 期间。
- 缓存减少了对服务器的访问,也意味着服务器失去了对该URL的控制。可以通过添加 no-cache 以便服务器始终接受请求并发送预期的响应
请求折叠
共享缓存主要位于源服务器之前,旨在减少到源服务器的流量。
因此,如果多个相同的请求同时到达共享缓存,中间缓存将代表自己将单个请求转发到源,然后源就可以将结果重用于所有客户端。这称为请求折叠
请求同时到达时会发生请求折叠,因此即使响应中给出了 max-age=0 或 no-cache,它也会被重用
如果响应是针对特定用户个性化的,并且你不希望它在折叠中共享,则应添加 private 指令。
[图片]
常见的缓存模式
默认设置
缓存的默认行为(即对于没有 Cache-Control 的响应) 不是简单的“不缓存”,而是根据所谓的“启发式缓存”进行隐式缓存。
为了避免“启发式缓存”,最好显式地为所有响应提供一个默认的 Cache-Control 标头,一般为:
Cache-Control: no-cache
另外,如果服务实现了 cookie 或其他登录方式,并且内容是为每个用户个性化的,那么也必须提供 private ,以防止与其他用户共享:
Cache-Control: no-cache, private
缓存破坏
1. 可以使用包含基于版本号或哈希值的更改部分的 URL 来提供 JS 和 CSS。
2. 由于缓存根据他们的 URL 来区分资源,因此如果在更新资源时 URL 发生变化,缓存将不会在此被重用
3. 缓存破坏是一种在内容更改时修改 URL 来使响应在很长一段时间内可缓存的技术。该技术可以应用于所有子资源,例如图像
主要资源
1. 与子资源不同,主资源不能使用缓存破坏,因为他们的URL不能像子资源URL一样被修饰。
2. 对于这种情况, no-cache 将是合适的
托管缓存的更多信息
- 缓存主要资源很困难,因为仅使用 HTTP 缓存规范中的标准指令,在服务端上更新内容时无法主动删除缓存内容。
- 但是,可以通过部署托管缓存( 比如 CDN 或 service worker )来实现。
- Service Worker

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/72322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年数学建模国赛A 定日镜场的优化设计思路分析

构建以新能源为主体的新型电力系统&#xff0c;是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。定日镜是塔式太阳能光热发电站&#xff08;以下简称塔式电站&#xff09;收集太阳能的基本组件&#xff0c;其底座由…

论数据库的种类

摘要 数据库是现代信息管理和数据存储的重要工具&#xff0c;几乎在各个领域都有广泛应用。不同类型的数据库适用于不同的应用场景和需求。本文将介绍几种常见的数据库种类&#xff0c;并探讨它们的特点和适用范围。 正文 一、关系型数据库&#xff08;RDBMS&#xff09; 关…

IntelliJ IDEA中那些让你相见恨晚超好用插件

InteIIiJ IDEA 2023.2版本发布了,在2023.2中&#xff0c;官方根据用户的宝贵反馈对新UI做出了大量改进&#xff0c;新UI界面大大减少了干扰&#xff0c;可以让用户更好地专注于代码。相信很多同学都已经迫不及待地尝试了。 安装激活好 Intellij idea 之后&#xff0c;再搭配如下…

小米手机便签怎么导出到华为mate60Pro手机上?

华为mate60Pro手机于2023年8月29日发布了先锋计划&#xff0c;有不少网友都抢到了这款新机。而有一些网友表示自己在换手机之前遇到了问题&#xff0c;这就是之前使用的手机是小米&#xff0c;所以需要把重要的图片、短信、通讯录、便签等数据导出到新的手机上&#xff0c;但是…

使用ChatGLMTokenizer处理json格式数据

我下载了一些中文wikipedia数据&#xff0c;准备采用ChatGLMTokenizer对齐进行清洗&#xff0c;整理为预训练语料。 import numpy as np import json from tqdm import tqdm from chatglm_tokenizer.tokenization_chatglm import ChatGLMTokenizertokenizer ChatGLMTokenizer…

微信小程序父组件向子组件传参,子组件样式无效问题处理

微信小程序父组件向子组件传参,子组件样式无效问题处理 父组件代码 引入 json "usingComponents": {"evaluate":"../evaluate/evaluate"},wxml <evaluate id1111></evaluate>子组件代码 json {"usingComponents": {&…

yolov7添加注意力机制

yolov7结构图 方法&#xff1a;直接在common里改&#xff0c;在相关的后面加上就行 1、接受通道数的注意力机制 1、目的&#xff1a;在三个输出地方添加注意力 yolov7.yaml文件&#xff0c;换成其他模块 注意力链接 2、models下建SE.py 3、common.py下&#xff0c;先找c…

网络连接评分机制之NetworkFactory

在开机时,各个提供网络连接的对象需要向ConnectivityService注册自己,并把自己所提供的网络的分值告诉ConnectivityService。 为了ConnectivityService便于统一管理,每一个具备提供网络服务的对象都需要创建一个NetworkFactory的子类对象,并利用该对象注册自己,以及提供自…

Spring Cloud服务发现与注册的原理与实现

Spring Cloud服务发现与注册的原理与实现 一、简介1 服务发现的定义2 服务发现的意义 二、Spring Cloud服务注册与发现的实现1 Spring Cloud服务注册1.1 服务注册的基本框架1.2 服务注册的实现方式 2 Spring Cloud服务发现2.1 服务发现的基本框架2.2 服务发现的实现方式 三、Sp…

JDK8的lambda方式List多字段排序List.stream().sorted()

JDK8的lambda方式List多字段排序List.stream().sorted() 多字段排序 List<HumanDetailDownloadVO> collect dataList.stream().sorted(// 日期 倒序 Comparator.comparing(HumanDetailDownloadVO::getDate_str, Comparator.reverseOrder())// 仓id 倒序 .thenCompari…

【Java项目实战】牛客网论坛项目1 - Spring入门与初识SpringMVC

目录 Spring 入门SpringInitializrApplicationContextAwareControllerDAODAO 名称索引ServiceConfig自动装配 初识 SpringMVCHttp 请求GETPOSTHTML 渲染响应 JSON 数据 Spring 入门 SpringInitializr IDEA 专业版自带的功能&#xff0c;也可以直接搜索对应网站&#xff0c;通…

数据库概念

定义&#xff1a; 数据库&#xff08;Database 简称DB&#xff09;是持久存储有组织/可共享数据/的容器 数据库管理系统(MySQL、Oracle、DB2)是操作/和管理数据库/的软件 分类&#xff1a; 关系(型)数据库 (MySQL、Oracle、SQL Server、SQLite、DB2) 非关系(型)数据库 (Redis…

华为云 存在不支持迁移的外键解决方法

DRS 检测出源端存在不支持的外键引用操作 MySQL、GaussDB(for MySQL)为源的全量增量或增量迁移、同步场景&#xff0c;以及MySQL、GaussDB(for MySQL)为源灾备场景 表1 源端存在不支持的外键引用操作 预检查项 源端存在不支持的外键引用操作。 描述 同步对象中存在包含CASC…

git如何查看和修改用户名和邮箱

一、查看Git全局配置的用户名和邮箱 在Git中可以通过以下命令查看你的全局配置&#xff1a; git config --global user.namegit config --global user.email其中&#xff0c;git config是Git配置命令&#xff0c;--global是全局配置选项&#xff0c;user.name和user.email是我…

Unity物体查找方式

参考资料 cUnity中使用GameObject.Find、Transform.Find查找GameObject_思月行云的博客-CSDN博客 GameObject.Find 通过名字或路径查找游戏对象。 GameObject.Find("GameObject"); GameObject.Find("GameObject/ChildGameObject); 使用规范: 1.无法查找隐藏…

配置Jedis连接池

一、概述 Jedis本身是线程不安全的&#xff0c;并且频繁的创建和销毁连接会有性能损耗&#xff0c;因此推荐使用Jedis连接池代替Jedis的直连方式。 二、创建连接池 public class JedisConnectionFactory {private static final JedisPool jedisPool;static {//配置连接池Jedi…

Centos 7 通过Docker部署OnlyOffice

前言&#xff1a; 在本文中&#xff0c;我们将详细介绍如何使用 Docker 部署功能强大的协作办公套件 OnlyOffice。通过 Docker&#xff0c;您可以轻松构建、部署和管理 OnlyOffice&#xff0c;从而提高团队协作和企业办公的效率。 一、安装Docker 1、向系统添加Docker CE软件仓…

windows下运行springboot的jar包,修改替换class文件,修改配置文件application,打包

在windows下跑springboot的jar包&#xff0c;经常会用到一些命令行和操作。 1、修改配置文件&#xff08;以application.yml为例&#xff09; #提取文件 jar xvf mqtt-10.1.0.jar BOOT-INF/classes/application.yml#将文件装回jar包 jar uvf mqtt-10.1.0.jar BOOT-INF/classe…

Qt简易闹钟

配置文件 QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compi…

Json“牵手”当当网商品详情数据方法,当当商品详情API接口,当当API申请指南

当当网是知名的综合性网上购物商城&#xff0c;由国内著名出版机构科文公司、美国老虎基金、美国IDG集团、卢森堡剑桥集团、亚洲创业投资基金&#xff08;原名软银中国创业基金&#xff09;共同投资成立1。 当当网从1999年11月正式开通&#xff0c;已从早期的网上卖书拓展到网…