前端缓存之http缓存

前端缓存之http缓存前端缓存可分为两大类 http 缓存和浏览器缓存 我们今天重点讲的是 http 缓存 所以关于浏览器缓存大家自行去查阅 下面这张图是前端缓存的一个大致知识点 HTTP 缓存策略分为两种 强缓存和协商缓存 这两种缓存策略都是服务端设置 HTTPHeader 来实现的 一 强缓存强缓存的意思很简单 直接从浏览器缓存过的本地进行读取 不会去请求服务器 例如请求一个图片 当缓存后 第二次访问 直接从本地去拿 不会再去请求这个资源 可以节省服务器资源 在 chrome 控制台的

前端缓存可分为两大类:http缓存和浏览器缓存。我们今天重点讲的是http缓存,所以关于浏览器缓存大家自行去查阅。下面这张图是前端缓存的一个大致知识点:

前端缓存之http缓存

HTTP 缓存策略分为两种: 强缓存 协商缓存 ,这两种缓存策略都是服务端设置 HTTP Header 来实现的。

 

(一)强缓存

        强缓存的意思很简单,直接从浏览器缓存过的本地进行读取,不会去请求服务器。例如请求一个图片,当缓存后,第二次访问,直接从本地去拿,不会再去请求这个资源,可以节省服务器资源。在chrome控制台的Network选项中可以看到该请求返回200的状态码。

(二)协商缓存

        协商缓存表示在使用本地的缓存之前,会先向服务器发一个请求,与服务器协商当前浏览器的缓存是否已经过期了,如果没过期,那么就使用本地的资源,如果过期了就去请求最新资源。协商缓存主要是解决强缓存资源不能及时更新的问题

(三)共同点和区别

(四)相关Header:

(一)强缓存:

  • Expires :response header里的过期时间,浏览器再次加载资源时,如果在这个过期时间内,则命中强缓存。
  • Cache-Control:当值设为max-age=300时,则代表在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。

区别:Expires 是http1.0的产物,Cache-Control是http1.1的产物

两者同时存在的话,Cache-Control优先级高于Expires
Expires其实是过时的产物,现阶段它的存在只是一种兼容性的写法





(二)协商缓存:

  • ETag和If-None-Match:

Etag是上一次加载资源时,服务器返回的response header,是对该资源的一种唯一标识

只要资源有变化,Etag就会重新生成

浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match

服务器接受到If-None-Match的值后,会拿来跟该资源文件的Etag值做比较,如果相同,则表示资源文件没有发生改变,命中协商缓存。

  • Last-Modified和If-Modified-Since

Last-Modified是该资源文件最后一次更改时间,服务器会在response header里返回

同时浏览器会将这个值保存起来,下一次发送请求时,放到request headr里的If-Modified-Since

服务器在接收到后也会做对比,如果相同则命中协商缓存

在精确度上,Etag要优于Last-Modified,Last-Modified的时间单位是秒,如果某个文件在1秒内改变了多次,那么他们的Last-Modified其实并没有体现出来修改,但是Etag每次都会改变确保了精度

在性能上,Etag要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个hash值。
在优先级上,服务器校验优先考虑Etag。
所以,两者互补







强缓存 VS 协商缓存:最好是配合在一起用,争取最大化的减少请求,利用缓存,节约流量。

(五)浏览器缓存过程:

  1. 浏览器第一次加载资源,服务器返回200,浏览器将资源文件从服务器上请求下载下来,并把response header及该请求的返回时间(要与Cache-Control和Expires对比)一并缓存;
  2. 下一次加载资源时,先比较当前时间和上一次返回200时的时间差,如果没有超过Cache-Control设置的max-age,则没有过期,命中强缓存,不发请求直接从本地缓存读取该文件(如果浏览器不支持HTTP1.1,则用Expires判断是否过期);
  3. 如果时间过期,服务器则查看header里的If-None-MatchIf-Modified-Since ;
  4. 服务器优先根据Etag的值判断被请求的文件有没有做修改,Etag值一致则没有修改,命中协商缓存,返回304;如果不一致则有改动,直接返回新的资源文件带上新的Etag值并返回 200;
  5. 如果服务器收到的请求没有Etag值,则将If-Modified-Since和被请求文件的最后修改时间做比对,一致则命中协商缓存,返回304;不一致则返回新的last-modified和文件并返回 200;

使用协商缓存主要是为了进一步降低数据传输量,如果数据没有变,就不必要再传一遍

(六)用户行为对浏览器缓存的控制:

地址栏访问

链接跳转是正常用户行为,将会触发浏览器缓存机制【浏览器发起请求,按照正常流程,本地检查是否过期,或者服务器检查新鲜度,最后返回内容】

F5刷新:

浏览器会设置max-age=0,跳过强缓存判断,会进行协商缓存判断【浏览器直接对本地的缓存文件过期,但是会带上If-Modifed-Since,If-None-Match(如果上一次response带Last-Modified, Etag)这就意味着服务器会对文件检查新鲜度,返回结果可能是304,也有可能是200.】

ctrl+F5强制刷新:

跳过强缓存和协商缓存,直接从服务器拉取资源。【浏览器不仅会对本地文件过期,而且不会带上If-Modifed-Since,If-None-Match,相当于之前从来没有请求过,返回结果是200.】

 

(七)如何不缓存

Cache-Control其他字段:

  • no-cache: 虽然字面意义是“不要缓存”。但它实际上的机制是,仍然对资源使用缓存,但每一次在使用缓存之前必须向服务器对缓存资源进行验证。
  • no-store: 不使用任何缓存

禁止缓存:

Cache-Control: no-cache, no-store, must-revalidate

Expires:设为当前时间之前

(八)前端开发设置不缓存:

在引用js、css文件的url后边加上 ?+Math.random()

 

设置html页面不让浏览器缓存的方法

 
   
    
     
     
    
  

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210703.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午7:05
下一篇 2026年3月19日 上午7:05


相关推荐

  • 安装cloudsim[通俗易懂]

    安装cloudsim[通俗易懂]1.CloudSim介绍       2009年,墨尔本大学的网格实验室和Gridbus项目宣布推出云计算仿真软件,称为CloudSim。它是在离散事件模拟包SimJava上开发的函数库,可在Windows和Linux系统上跨平台运行,CloudSim继承了GridSim的编程模型,支持云计算的研究和开发,并提供了以下新的特点:(1)支持大型云计算的基础设施的建模与仿真;(2)一

    2022年10月9日
    2
  • vue监听页面刷新事件_vue监听数据变化自动刷新

    vue监听页面刷新事件_vue监听数据变化自动刷新运用的知识点:JavaScript的onbeforeunload函数使用方法window.onbeforeunload=function(){  return‘’;}注意:有返回值(”,true,false…都可以)才能弹出显示,或者有需要执行的事件也行。onload、onunload、onbeforeunload的执行问题:页面加载…

    2025年8月3日
    5
  • 让Ubuntu可以压缩/解压缩RAR文件

    让Ubuntu可以压缩/解压缩RAR文件

    2021年6月5日
    111
  • js对象转json字符串

    js对象转json字符串js 对象转 json 字符串将 js 对象转为 json 格式的字符串 可以用 JSON stringify 方法 varuser1 height 170 name 张三 varuser1Str JSON stringify user1 console info user1Str typeofuser1S 使用 typeof 来获取对象 user1Str 的类型 能看到控制台输出的 user1 的值以及它的类型 string height 170 name 张三 s

    2026年3月20日
    2
  • Kubernetes (K8s) 实战部署 OpenClaw:从环境准备到生产级配置

    Kubernetes (K8s) 实战部署 OpenClaw:从环境准备到生产级配置

    2026年3月13日
    3
  • response中如何设置contentType

    response中如何设置contentTypeajax开发中,常遇到下面的几种情况:1服务端需要返回一段普通文本给客户端2服务端需要返回一段HTML代码给客户端3服务端需要返回一段XML代码给客户端4服务端需要返回一段javascript代码给客户端5服务端需要返回一段json串给客户端================================对于每一种返回类型规范的做法是要在服务端…

    2022年7月19日
    136

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号