浏览器缓存的解决方案

——IT唐伯虎

摘要:浏览器缓存的解决方案,包括传统前端和现代前端。

前言:本文只针对文件请求(html、css、js)进行分析,但不涉及json数据请求。

浏览器的状态

(1)当浏览器向服务器发起请求,如果请求正常,状态是200。

(2)浏览器接收到请求结果后,如果会根据响应头设置的缓存规则,把请求结果存起来。

(3)当浏览器再次发起相同的请求的时候,浏览器会先向服务器比对文件,只对比最后修改时间,如果最后修改时间变化就重新获取请求结果,此时状态是200;如果最后修改时间没有变化则从缓存读,此时状态是304。

(4)304状态是比较理想的缓存使用方案,但是往往来说,浏览器会走另一条粗暴的路线,即不进行时间比对,直接从缓存读,此时状态是200已缓存。

(200)> (304) > (200已缓存)

(10ms)>(5ms)> (0ms)

浏览器的刷新

(1)按F5刷新:

从缓存读取文件,然后将这些文件向服务器对比,如果最后修改时间变化就重新下载,此时状态是200,如果没变就从缓存读,此时状态是304,这是只理想情况,有些时候,只从缓存读取,状态是200已缓存。

(2)按ctrl+F5强制刷新:

强制删除当前页面的所有缓存,并且重新下载,此时状态是200。

(3)手动清除浏览器所有缓存:

强制删除浏览器的所有缓存,访问的时候重新下载,此时状态是200。

(4)在页面上点击链接、或者在地址栏输入、或者从浏览器书签进入,等等的大多数途径,

浏览器只从缓存读取,此时状态是200已缓存。

综上所述,需要清缓存的情况是第4点,其次是第1点的后半段。

改进方案

(1)css、js

这两种资源是由html指定调用的,只要html里指定的css、js链接变化了,浏览器就会加载新的css、js。

传统前端的方案是手动加版本号

<link href="css/style.css?v=${code}">

<script src="js/front.js?v=${code}"></script>

${code}代表版本号,由freemarker或jsp进行赋值,如果版本号变化了,整个网站的所有css、js都会重新下载。

现代前端的方案是自动加版本号

app.a7dec7ac.js

chunk-4a91bce9.b219889e.css

这种方案依赖于webpack、gulp等打包工具,打包结果自带了hash值,这些hash值是根据文件的最后修改时间生成的,如果文件没改过,名字就不会变化,这种方案控制缓存更为精确。

(2)html

在css、js加上版本控制之后,已经能避开大多数情况下的缓存,但由于css、js是由html指定调用的,所以说,如果html被缓存了,浏览器依旧会去调用旧的css、js。其中,上文“浏览器的刷新”第4点就会走这条路线。

html的文件名是跟浏览器的地址相关的。html文件名是什么,用户在浏览器就需要输入什么。所以说,不能给html文件加上版本号。对于html文件,我们采取禁用缓存的方案:

传统前端,在后端给需要的html加上响应头

response.addHeader("Cache-Control", "no-cache, no-store");

现代前端,在nginx给index.html加上响应头

location = /index.html {

add_header Cache-Control "no-cache, no-store";

}

原文地址:https://www.cnblogs.com/liangweiping/p/11791961.html

时间: 2024-08-01 11:23:14

浏览器缓存的解决方案的相关文章

[原创]java WEB学习笔记45:自定义HttpFilter类,理解多个Filter 代码的执行顺序,Filterdemo:禁用浏览器缓存的Filter,字符编码的Filter,检查用户是否登陆过的Filter

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

浏览器缓存知识小结及应用

阅读目录 1. 浏览器缓存基本认识 2. 强缓存的原理 3. 强缓存的管理 4. 强缓存的应用 5. 协商缓存的原理 6. 协商缓存的管理 7. 浏览器行为对缓存的影响 浏 览器缓存,也就是客户端缓存,既是网页性能优化里面静态资源相关优化的一大利器,也是无数web开发人员在工作过程不可避免的一大问题,所以在产品开发的 时候我们总是想办法避免缓存产生,而在产品发布之时又在想策略管理缓存提升网页的访问速度.了解浏览器的缓存命中原理,是开发web应用的基础,本文着眼 于此,学习浏览器缓存的相关知识,总

Java缓存学习之二:浏览器缓存机制

浏览器端的九种缓存机制介绍 浏览器缓存是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器端缓存的机制种类较多,总体归纳为九种,这里详细分析下这九种缓存机制的原理和使用场景.打开浏览器的调试模式->resources左侧就有浏览器的8种缓存机制. 一.http缓存 http缓存是基于HTTP协议的浏览器文件级缓存机制.即针对文件的重复请求情况下,浏览器可以根据协议头判断从服务器端请求文件还是从

浏览器缓存(转)

浏览器缓存 浏览器缓存的知识是前端工程师必须要掌握的,因为这些知识直接影响到你的页面的用户体验,影响到你的页面的加载策略.接下来将要详细的讲述浏览器缓存的概 念和原理,新人要仔细阅读,甚至要多次反刍,缓存的知识除了和浏览器有关,还涉及到HTTP协议,所以这也是比较难于掌握的内容. 一般在硬件中,缓存在硬件中分一级缓存,二级缓存.但在软件中的缓存却不一样. 狭义上讲缓存就叫高速缓存,严格讲就是将数据暂时存放到某个地方.先要声明下,我的定义可能不严格,但这是我的理解,通俗易懂. 至于存到什么地方就有

web基础-web工作原理,http协议,浏览器缓存

1,web工作原理 2,http协议 3,浏览器缓存 4,cookie和session -------------------------------------------------------------------------------------------------------------------------------- 1,web工作原理 平时用浏览器,输入网址后回车,页面响应我们想要浏览的内容,简单操作的背后蕴涵了什么原理? 当输入url回车后,客户端(浏览器)会去请求

手机浏览器缓存和电脑浏览器缓存的问题记录

一.背景描述: 为了优化web网页速度,我们采取了js,css合并压缩,并在服务端控制.所以我就学习了一下,浏览器缓存的原理. 因为我不想使用版本号控制,版本号具有诸多弊端: 1.每次修改都得修改版本号. 2.如果所有页面的引用,单独配置版本号,那么每次的修改量很大: 3.如果为了避免2的问题,针对所有页面使用同一个熟悉配置,那么每次修改一个文件并更新版本号之后,所有的引用的版本号都更新了,太傻了. 所以,不采取版本号控制,使用时间控制,页面引用不用变,目标文件发生了变化,服务器能告诉客户端浏览

浏览器缓存和压缩优化技术

一.HTTP缓存机制缓存分类1.200 from cache:直接从本地缓存中获取响应,最快速,最省流量,因为根本没有向服务器发送请求:2.304 NOT Modified:协商缓存,浏览器在本地没有命中的情况下,请求头发送一定的校检数据到服务端,如果服务端数据没有改变浏览器从本地缓存响应,返回304快速,发送的数据很少,只返回一些基本的响应头信息,数据量很小,不发送实际的响应体:3.200 OK:以上两种缓存失败,服务器返回完整的响应.没有用到缓存,相对较慢:相关的头信息:Pragma:HTT

浏览器缓存机制浅析

非HTTP协议定义的缓存机制 浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires: Cache-control等).但是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下: <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 上述代码的作用是告诉浏览器当前页面不被缓存,每

浏览器缓存控制

浏览器缓存控制 Last-Modified/ If-Modified-Since 在浏览器第一次请求某一个URL时,服务器端的返回状态码200,内容是客户端请求的资源,同时有一个Last-Modified的属性标记此文件在服务器端最后被修改的时间. Last-Modified格式类似这样:Last-Modified : Fri , 12 May 2006 18:53:33 GMT 客户端第二次请求此URL时,根据HTTP协议的规定,浏览器会向服务器传送If-Modified-Since报头,询问