最近看了很多关于缓存的文章, 每次看完,看似明白但是实际还是没明白,这次总算搞明白协商缓存是怎么回事了

首先,服务器缓存分强制缓存和协商缓存(也叫对比缓存)

强制缓存一般是服务端在请求头携带字段Expires 来指定过期时间,不过这个字段已经是HTTP1的字段了(也可以使用);

强制缓存还有一个字段是Cache-Control : 这个字段主要值有 no-store no-cache max-age等来设置强制缓存(max-age来设置资源的过期时间)

下面重点需要搞明白的是协商缓存,也就是对比缓存

① 协商缓存发生在强制缓存失效之后,浏览器根据缓存标识决定是否使用缓存的过程

②协商缓存发生的过程如下:

 1. 通过  Last-Modified值,和If-Modify-Since字段 判断是否要缓存

-浏览器第一次请求    这时候不会携带缓存标识

-服务器第一次返回    这个时候服务端设置响应头  Last-Modified , 值为最后一次修改时间

-浏览器第一次接收到响应   接收到服务器设置的响应头  响应体等

- 浏览器第二次请求  这个时候浏览器会先检测到Last-Modified 字段,于是发送请求的时候携带If-Modified-Since 请求头,值就是浏览器第一次返回回来的Last-Modified的值;

-服务器第二次接受到请求  这个时候会对比这个值和服务器中这个资源修改时间;如果没有变化则直接返回携带304的响应头和空的响应体,浏览器则直接读取缓存,如果不等(小于服务器上的这个修改时间),说明文件有更新,返回新的资源

-这样缓存目的就达到了

2. 通过浏览器携带的If-None-Match字段和Etag 值判断是否需要缓存

-浏览器第一次请求  这个时候请求头不会携带缓存标识

-服务器第一次响应  这个时候响应头携带Etag字段,值为改资源文件唯一标识(这个值生成有一定规则 掘金有文章写的是last_modified 与 content_length组成

- 浏览器第二次发起请求  这个时候浏览器请求头携带If-None-Match字段,值为Etag的值

- 服务器接受到这个请求字段之后,把If-None-Match的值和这个资源的Etag值进行比较,如果不同,则会返回完整的报文信息;如果一致,则只返回带304的响应头,浏览器在缓存中读取缓存的资源

搞明白的方法还是自己笔和纸画出来的,嗯 ,加油;

一篇文章带你整明白HTTP缓存知识的更多相关文章

  1. MYSQL(进阶篇)——一篇文章带你深入掌握MYSQL

    MYSQL(进阶篇)--一篇文章带你深入掌握MYSQL 我们在上篇文章中已经学习了MYSQL的基本语法和概念 在这篇文章中我们将讲解底层结构和一些新的语法帮助你更好的运用MYSQL 温馨提醒:该文章大 ...

  2. MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界

    MYSQL(基本篇)--一篇文章带你走进MYSQL的奇妙世界 MYSQL算是我们程序员必不可少的一份求职工具了 无论在什么岗位,我们都可以看到应聘要求上所书写的"精通MYSQL等数据库及优化 ...

  3. 一篇文章带你掌握主流数据库框架——MyBatis

    一篇文章带你掌握主流数据库框架--MyBatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射. 在之前的文章中我们学习了MYSQL和JDBC,但是这些东西远远不 ...

  4. 一篇文章带你掌握主流基础框架——Spring

    一篇文章带你掌握主流基础框架--Spring 这篇文章中我们将会介绍Spring的框架以及本体内容,包括核心容器,注解开发,AOP以及事务等内容 那么简单说明一下Spring的必要性: Spring技 ...

  5. 一篇文章带你掌握主流服务层框架——SpringMVC

    一篇文章带你掌握主流服务层框架--SpringMVC 在之前的文章中我们已经学习了Spring的基本内容,SpringMVC隶属于Spring的一部分内容 但由于SpringMVC完全针对于服务层使用 ...

  6. 一篇文章带你了解NoSql数据库——Redis简单入门

    一篇文章带你了解NoSql数据库--Redis简单入门 Redis是一个基于内存的key-value结构数据库 我们会利用其内存存储速度快,读写性能高的特点去完成企业中的一些热门数据的储存信息 在本篇 ...

  7. 一篇文章带你了解轻量级Web服务器——Nginx简单入门

    一篇文章带你了解轻量级Web服务器--Nginx简单入门 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件代理服务器 在本篇中我们会简单介绍Nginx的特点,安装,相关指令使用以及配置信 ...

  8. 一篇文章带你掌握主流办公框架——SpringBoot

    一篇文章带你掌握主流办公框架--SpringBoot 在之前的文章中我们已经学习了SSM的全部内容以及相关整合 SSM是Spring的产品,主要用来简化开发,但我们现在所介绍的这款框架--Spring ...

  9. 一篇文章带你掌握MyBatis简化框架——MyBatisPlus

    一篇文章带你掌握MyBatis简化框架--MyBatisPlus 我们在前面的文章中已经学习了目前开发所需的主流框架 类似于我们所学习的SpringBoot框架用于简化Spring开发,我们的国人大大 ...

随机推荐

  1. laravel7 ajax H-ui框架添加数据至数据库

    1:定义路由: //租房 Route::resource('house','fang\FangattrController'); 2:控制器访问前端框架: public function create ...

  2. 软件工程homework-004

    软件工程软件工程homework-004 博客信息 沈阳航空航天大学计算机学院2020软件工程作业 作业要求 https://edu.cnblogs.com/campus/sau/Computer17 ...

  3. C++中vector::data()使用心得和对自定义类型指针运算符的默认重载

    一.C++ vector::data()函数 返回值类型:vector的基类 返回值:Returns a pointer such that [data(), data() + size()] is ...

  4. python爬虫-使用线程池与使用协程的实例

    背景:爬取豆瓣电影top250的信息 使用线程池 import re from concurrent.futures import ThreadPoolExecutor import requests ...

  5. OpenCores注册步骤和成功提交

    一  OpenCores 网站简介,这个是全世界最大的FPGA开源IP核网站.由于最近在学习USB2.0host control IP,所以想去网上下载相关的IP例程学习.通过搜索发现,有两个网站十分 ...

  6. 用Markdown写Html和.md也就图一乐,真骚操作还得用来做PPT

    前言 和这篇文章一样,我就是用Markdown写的.相信各位平时也就用Markdown写写文档,做做笔记,转成XHtml.Html等,今天教大伙一招骚操作:用Markdown写PPT. 绝大多数朋友做 ...

  7. KCP协议:从TCP到UDP家族QUIC/KCP/ENET

    行文前先安利下<再深谈TCP/IP三步握手&四步挥手原理及衍生问题-长文解剖IP >.<再谈UDP协议-浅入理解深度记忆> KCP协议科普 KCP是一个快速可靠协议,能 ...

  8. 有哪些不同类型的IOC(依赖注入)方式?

    构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖. Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参stati ...

  9. 为什么线程通信的方法 wait(), notify()和 notifyAll()被定 义在 Object 类里?

    Java 的每个对象中都有一个锁(monitor,也可以成为监视器) 并且 wait(),notify() 等方法用于等待对象的锁或者通知其他线程对象的监视器可用.在 Java 的线程中 并没有可供任 ...

  10. 说说三元运算和if...else的相同之处

    三元运算符和if-else语句:不同之处. a) 三元运算符是必须要有返回值,而if-else语句并不一定有返回值,其执行结果可能是赋值语句或者打印输出语句. b) java三元表达式有字符强转(双目 ...