HTTP 缓存机制

一、强制缓存

只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存而无需再请求服务器。

强制缓存是利用下面这两个 HTTP 响应头部(Response Header)字段实现的,它们都用来表示资源在客户端缓存的有效期:

  • Cache-Control, 是一个相对时间;
  • Expires,是一个绝对时间;

如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,Cache-Control 的优先级高于 Expires 。

Cache-control 选项更多一些,设置更加精细,所以建议使用 Cache-Control 来实现强制缓存。具体的实现流程如下:

  • 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 Cache-Control,Cache-Control 中设置了过期时间大小;
  • 浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与 Cache-Control 中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;
  • 服务器再次收到请求后,会再次更新 Response 头部的 Cache-Control。

二、协商缓存

与服务端协商之后,通过协商结果来判断是否使用本地缓存。

协商缓存可以基于两种头部来实现。

第一种:请求头部中的 If-Modified-Since 字段与响应头部中的Last-Modified字段

                (基于时间实现)

  • 响应头部中的 Last-Modified:标示这个响应资源的最后修改时间;
  • 请求头部中的 If-Modified-Since:当资源过期了,发现响应头中具有 Last-Modified 声明,则再次发起请求的时候带上 Last-Modified 的时间,服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进行对比(Last-Modified)。
  • 如果最后修改时间较早,说明资源又被改过,则返回最新资源,HTTP 200 OK;
  • 如果最后修改时间较小,说明资源无新修改,响应 HTTP 304 走缓存。

第二种:请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段

                (基于一个唯一标识实现,能更准确地判断文件内容是否被修改)

  • 响应头部中ETag:唯一标识响应资源;
  • 请求头部中的 If-None-Match:当资源过期时,浏览器发现响应头里有 Etag,则再次向服务器发起请求时,会将请求头 If-None-Match 值设置为 Etag 的值。服务器收到请求后进行比对,如果资源没有变化返回 304,如果资源变化了返回 200。

如果在第一次请求资源的时候,服务端返回的 HTTP 响应头部同时有 Etag 和 Last-Modified 字段,那么客户端再下一次请求的时候,如果带上了 ETag 和 Last-Modified 字段信息给服务端,这时 Etag 的优先级更高,也就是服务端先会判断 Etag 是否变化了,如果 Etag 有变化就不用在判断 Last-Modified 了,如果 Etag 没有变化,然后再看 Last-Modified。

为什么 ETag 的优先级更高?

这是因为 ETag 主要能解决 Last-Modified 几个比较难以解决的问题:

  1. 在没有修改文件内容情况下文件的最后修改时间可能也会改变,这会导致客户端认为这文件被改动了,从而重新请求;
  2. 可能有些文件是在秒级以内修改的,If-Modified-Since 能检查到的粒度是秒级的,使用 Etag就能够保证这种需求下客户端在 1 秒内能刷新多次;
  3. 有些服务器不能精确获取文件的最后修改时间。

注意,协商缓存这两个字段都需要配合强制缓存中 Cache-Control 字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求

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

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

相关文章

六个自媒体写作方法,提升自媒体创作收益

在自媒体时代,写作成为了一个不可或缺的技能。特别是对于新手来说,掌握一些有效的写作方法,可以事半功倍,更好地展现个人创意和观点。在这里,我将分享六个适合新手的自媒体写作方法,希望能够为你在写作之路…

肾虚的16个表现,你有吗?

现代研究发现:导致人体衰老的根本原因不是年龄,而是“肾虚”。此外,肾虚不是男人的专利,女人肾虚的危害更大。 一、肾虚的16个表现 1、总感觉口咸 我们的五味(酸苦甘辛咸)跟我们的脏腑是相对应的&#xf…

基于jsp+servlet的在线考试系统

基于jspservlet的在线考试系统, 演示地址:英语在线考试系统考生测试账号:用户名:stu,密码:stu,管理员测试账号用户名:admin,密码:admin (源码里包含数据库文件) 本系统分为两个角色,一个时考生,一个是管理员,考生可…

马来西亚虾皮选品工具:如何优化您的电商业务

随着电子商务的快速发展,越来越多的商家开始将目光投向在线市场。在马来西亚,虾皮(Shopee)平台成为了一个备受瞩目的电商平台,吸引了大量的商家和消费者。然而,要在这个竞争激烈的市场中脱颖而出并取得成功…

Java程序员,你掌握了多线程吗?【文末送书】

目录 摘要 01、多线程对于Java的意义 02、为什么Java工程师必须掌握多线程 03、Java多线程使用方式 04、如何学好Java多线程 参与方式🥇 推荐一个人工智能学习网站 https://www.captainbed.cn/bear 摘要 互联网的每一个角落,无论是大型电商平台的…

Image augmentation for classification¶

参考文章: We can divide the process of image augmentation into four steps: 1.导入albumentations和 a library库以从磁盘读取图像(例如,OpenCV)。 2.Define an augmentation pipeline 管道. 3.Read images from the disk…

EUREKA: HUMAN-LEVEL REWARD DESIGN VIACODING LARGE LANGUAGE MODELS

目录 一、论文速读 1.1 摘要 1.2 论文概要总结 相关工作 主要贡献 论文主要方法 实验数据 未来研究方向 二、论文精度 2.1 论文试图解决什么问题? 2.2 论文中提到的解决方案之关键是什么? 2.3 用于定量评估的数据集是什么?代码有…

各种滤波算法的比较(GF、KF、EKF、UKF、PF)

目录 一、前言 二、滤波算法介绍 1、GF(高斯滤波) 2、KF(卡尔曼滤波) 3、EKF(可扩展卡尔曼滤波) 4、UKF(无迹卡尔曼滤波) 5、PF(粒子滤波) 三、不同滤…

windows MYSQL下载和自定路径安装,以及解决中文乱码问题。

文章讲的很详细,请耐心往下看。 一、mysql下载 下载网址:https://www.mysql.com/downloads/ 表示不登录,直接下载。 以上就把安装包下载完了。下载是8.0.35版本。 二、接下来看怎么安装 1.双击安装包,进行安装。 注意&#x…

零容忍泄露:掌握上海迅软DLP企业加密系统的数据安全秘诀

由于企事业单位内部数据呈暴发式增长,且数据类型日益繁杂,企业对数据的安全管控难度也在不断增大。这其中包括研发的设计文档、代码、图纸,以及业务运营的详细收支情况、招商投标的详细信息等,这些涉及到企业核心数据资产的信息需…

情怀阿拉德【弑神大陆】linux服务端+双端+GM后台+详细搭建教程

搭建资源下载:情怀阿拉德【弑神大陆】linux服务端双端GM后台详细搭建教程-海盗空间

idea开发环境配置

idea重新安装后,配置的东西还挺多的,这里简单记录一下。 1、基础配置 1.1、主题、背景、主题字体大小 1.2、默认字体设置 控制台默认编码设置: 全局文件默认编码设置: 2、构建、编译、部署配置 说明:本地装了JD…