• 什么是浏览器的缓存机制


    先来粗略的概念:

      • 什么是浏览器的缓存机制

    浏览器的缓存机制就是把一个请求过的web资源(例如:html页面、图片、js、数据等)拷贝一份副本储存在浏览器中;缓存会根据进来的请求保存输出内容的副本,当下一个请求到来的时候,如果是相同的URL,缓存会根据缓存机制决定是否直接使用副本响应访问请求,还是向源服务器再次发送请求。比较常见的就是浏览器会缓存访问过的页面,当再次访问这个URL地址的时候,如果网页没有更新就不会再次下载网页,而是直接使用本地缓存的网页;只有当网站明确标识已更新,浏览器才会再次下载网页;

      • 浏览器缓存机制的好处
        减少网络宽带产生较小的流量,减轻服务器的压力,渲染缓存的页面,就减少了对源服务器的访问,提高响应页面的速度,用户再次打开不用等待时间过长;
      • 浏览器缓存的规则
        缓存的规则就是根据http协议头和html标签中的meta;从两个维度,新鲜度和校验度去判断浏览器是否应该使用缓存页面,还是加载新的页面,新鲜度就是指http协议头上有没有完整的过期时间,是不是已经使用过缓存页面了,那在一个会话中就已经检查过了;校验度就是从服务器返回的控制头中会带有资源的标签,如果下次访问的时候,这个标签相同那就使用缓存页面,如果不相同那就证明可能被修改或过期,那就重新发送请求;

    上面粗略的如果看懂了,或者能让你想起来浏览器的缓存机制就太棒了,没看明白的话咱接着往下看

    • 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,就先回忆一下HTTP报文

    HTTP请求(Request)报文,报文格式为:请求行 – HTTP头(通用信息头,请求头,实体头) – 请求报文主体(只有POST才有报文主体)
    HTTP响应(Response)报文,报文格式为:状态行 – HTTP头(通用信息头,响应头,实体头) – 响应报文主体

    注意:::通用信息头指的是请求和响应报文都支持的头域,

    分别为Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via;实体头则是实体信息的实体头域,分别为Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。这里只是为了方便理解,将通用信息头,响应头/请求头,实体头都归为了HTTP头。

      • 缓存过程

    浏览器与服务器通信的方式为应答模式,即是:浏览器发起HTTP请求 – 服务器响应该请求。那么浏览器第一次向服务器发起该请求后拿到请求结果,会根据响应报文中HTTP头的缓存标识,决定是否缓存结果,是则将请求结果和缓存标识存入浏览器缓存中

    浏览器缓存的关键:
    1、 浏览器每次发起请求,都会先在浏览器缓存中查找该请求的结果以及缓存标识
    2、 浏览器每次拿到返回的请求结果都会将该结果和缓存标识存入浏览器缓存中
    根据是否需要向服务器重新发起HTTP请求将缓存过程分为两个部分,分别是强制缓存协商缓存 。

    强制缓存

    强制缓存就是向浏览器缓存查找该请求结果,并根据该结果的缓存规则来决定是否使用该缓存结果的过程,强制缓存的情况主要有三种(暂不分析协商缓存过程),如下:

    (1)不存在该缓存结果和缓存标识,强制缓存失效,则直接向服务器发起请求(跟第一次发起请求一致)

    (2)存在该缓存结果和缓存标识,但是结果已经失效,强制缓存失效,则使用协商缓存(暂不分析)

    (3)存在该缓存结果和缓存标识,且该结果没有还没有失效,强制缓存生效,直接返回该结果

    那么强制缓存的缓存规则是什么?

    答:当浏览器向服务器发送请求的时候,服务器会将缓存规则放入HTTP响应的报文的HTTP头中和请求结果一起返回给浏览器,控制强制缓存的字段分别是Expires和Cache-Control,其中Cache-Conctrol的优先级比Expires高。

    Cache-Control是HTTP/1.1控制网页缓存的字段,默认值为private,表示所有内容都可以缓存;一般使用max-age=xxx,表示缓存内容将在xxx秒后失效,是一种绝对值,优化http1.0;

    协商缓存

    协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求由服务器根据缓存标识决定是否使用缓存的过程

    协商缓存的情况主要有两种:

    协商缓存生效,返回304,表示资源无更新,再次向浏览器缓存获取缓存结果
    协商缓存失败,返回200和请求结果,表示资源更新了,获取到结果后需要再次将结果和缓存标识存入浏览器缓存中

    那么协商缓存的缓存规则是什么?

    答:协商缓存的标识也是在响应报文的HTTP头中和请求结果一起返回给浏览器的,控制协商缓存的字段分别有:Last-Modified / If-Modified-Since和Etag / If-None-Match,其中Etag / If-None-Match的优先级比Last-Modified / If-Modified-Since高。

    Last-Modified是服务器响应请求时,返回该资源文件在服务器最后被修改的时间
    If-Modified-Since则是客户端再次发起该请求时,携带上次请求返回的Last-Modified值,通过此字段值告诉服务器该资源上次请求返回的最后被修改时间。服务器收到该请求,对比If-Modified-Since值与当前资源上一次被修改的时间,决定返回304或200

    1. Etag是服务器响应请求时,返回当前资源文件的一个唯一标识
    2. If-None-Match是客户端再次发起该请求时,携带上次请求返回的唯一标识Etag值,通过此字段值告诉服务器该资源上次请求返回的唯一标识值。服务器收到该请求后,服务器收到该请求,对比if-None-Match值与该资源在服务器的Etag值,决定返回304200

    总结:
    客户端每次向服务器发送前都会先找浏览器缓存看是否有缓存,若有结果且不失效则直接使用,无则发送请求;有结果但失效则协商缓存,带着缓存标识向服务器发送请求,通过对比if-None-Match(标识)或if-Modifined-Since(时间)确定资源是否修改,未修改返回304,直接找缓存拿结果;修改返回200,服务器返回新结果。

    拓展::::::::::::::::::::::::::::::::::;:::::::::::::::::::::
    Expires

    ExpiresHTTP/1.0控制网页缓存的字段其值为服务器返回该请求的结果缓存的到期时间,即再次发送请求时,如果客户端的时间小于Expires的值时,直接使用缓存结果。

    Expires是HTTP/1.0的字段,但是现在浏览器的默认使用的是HTTP/1.1,那么在HTTP/1.1中网页缓存还是否由Expires控制?

    到了HTTP/1.1,Expires已经被Cache-Control替代,原因在于Expires控制缓存的原理是使用客户端的时间与服务端返回的时间做对比,如果客户端与服务端的时间由于某些原因(时区不同;客户端和服务端有一方的时间不准确)发生误差,那么强制缓存直接失效,那么强制缓存存在的意义就毫无意义。、

    那么Cache-Control又是如何进行控制的?

    2.1.2Cache-Control

    在HTTP/1.1中,Cache-Control是最重要的规则,主要用于控制网页缓存,主要取值为:

    (1)public:所有内容都将被缓存(客户端和代理服务器都可缓存)

    (2)private:所有内容只有客户端可以缓存,Cache-Control的默认取值

    (3)no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定

    (4)no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存

    (5)max-age=xxx (xxx is numeric):缓存内容将在xxx秒后失效

    我们可以知道:

    (1)HTTP响应报文中expires的时间值,是一个绝对值

    (2)HTTP响应报文中Cache-Control为max-age=600,是相对值

    由于Cache-Control的优先级比expires高,那么直接根据Cache-Control的值进行缓存,意思就是说在600秒内再次发起该请求,则会直接使用缓存结果,强制缓存生效。

    注:在无法确定客户端的时间是否与服务端的时间同步的情况下,Cache-Control相比于expires是更好的选择,所以同时存在时,只有Cache-Control生效。

    好了, 以上是本文所有内容,希望对大家有所帮助,也希望大家对码农之家多多支持,你们的支持是我创作的动力!祝大家生活愉快!  

  • 相关阅读:
    计算机毕业设计springboot+vue文体用品商城网站
    【.Net实用方法总结】 整理并总结System.IO中StringReader类及其方法介绍
    【C语言趣味教程】(5) 常量:字面常量 | 类型常量 | const 关键字 | const 的声明 | 程序中的只读概念 | const 保护机制 | 如何巧妙区分 “指针常量“ 和 “常量指针“
    [附源码]java毕业设计校园博客系统
    爬虫 — 多线程
    (十一) 跨平台修图软件GIMP及其批处理插件
    Mysql集群及高可用-Mysql高可用MHA9
    国际版腾讯云/阿里云:云解析DNS是什么
    2022-09-13 mysql列存储引擎-POC-查询数据错误追踪
    java计算机毕业设计基于ssm的农业信息管理系统(源代码+数据库+Lw文档)
  • 原文地址:https://blog.csdn.net/wuxiaopengnihao1/article/details/127786502