浏览器缓存机制深入理解与实践(一)

  我们在web开发中常常会遇到这样的场景,有一些较大和常用的资源(例如图片、文档、js、css),在页面打开初始化的时候并不需要用到,而是在用户与页面互动操作触发了某些条件时才需要这些资源(例如我们打开微博可能并不是为了看热搜,但大多数时候我们会点进热搜查看热搜新闻)。

  那么问题来了,如果用户去点击查看热搜时,我们才去加载热搜所需要的相应的资源数据,就显得很被动了。因为在最常用的功能中,来耗费时间等待,这对用户来说其实并不是一个非常好的体验。所以,我们首先想到的是提前将这部分资源加载到浏览器缓存中,本文主要介绍了http两个不同的缓存机制。

一、http1.0——使用Expires,Last-Modified

  强制缓存:在http1.0时代,当客户端根据地址去获取图片、文档等缓存资源时,我们通过设置响应头中的Expires字段来给定一个时间点,并与放在响应体中的请求资源一同返回给客户端浏览器,并一起被保存于缓存中,下次我们再请求同一个路径地址拿资源时,浏览器强制请求从缓存中获取并返回200状态码。当浏览器的本地时间超过Expires字段设置的时间,缓存资源失效,再请求这个路径时需要去服务端重新获取资源。

  协商缓存:对于一些可能变化较大的资源,我们需要他们及时作出更新,但是又想继续使用缓存这种高效的方式,此时我们便不再使用Expires,而是使用Last-Modified字段,用来记录一个资源的最后改动时间,同样将该字段连同资源一起发返回给客户端。浏览器第二次请求该路径时,顺带把该字段值放入请求头中,不过此时会换一个字段名,变成If-Modified-Since,若服务器的资源发生变化,那这个资源文件肯定会有一个新的变化修改时间,服务器将新时间与旧时间一对比,发现不一致,将新资源放到响应体,新时间放入响应头,返回给客户端,客户端对缓存资源作出更新,状态码为200。若新时间与旧时间一致,说明资源未变化,返回状态码304 Not Modified,浏览器收到后,便可从缓存中取资源。下面是详细的步骤流程:

     1??.  客户端根据具体路径获取资源,此时服务器端会将该资源的一些基本信息自动封装http对象(包含响应头,响应体),Expires 表示该资源什么时候过期,Last-Modified表示该资源最后修改时间。

    2??.  浏览器拿到资源时,放入缓存中,等待用户使用。

    3??.  当用户使用功能需要该资源时,先检查是强制缓存还是协商缓存,前者则直接取,若两者都有Last-Modified、Expires同时存在,以强制缓存优先。若只是协商缓存则再次向服务器发送相同路径的请求,此时的请求头中附带上该资源的最后修改时间。

    4??.  服务器根据路径,检查最新资源的基本信息,是否与请求的基本信息一致。若一致,返回结果304 NotModified,此时服务器不再返回资源,而是再冗余返回一份基本信息,表示客户端缓存资源可用。若不一致,则返回状态码200和最新资源,还有最新资源的基本信息。当请求失败,也就是后台服务器挂掉的时候,这里也是返回304,继续使用缓存旧资源。

  

  http1.0返回304示例如下:

  

一、http1.1——使用Cache-Control,age,Etag

  在上张图片中我们发现返回头中有Cache-Control,Etag这些字段,其实这些也是服务器端对浏览器作缓存控制用到的字段,只不过是后来升级换代新加入的。在使用http1.0的时候我们发现,当本地时间与服务器端的时间不一致,或者是部署集群时,地域跨度太大,很容易引起缓存失效的问题,而且同时有两份修改时间一致的文件互相进行替换的时候,我们很难及时在浏览器端作出响应。因此我们在想,能不能直接设置一个时间段,而不是时间点的方式来对资源有效去作校验,使用资源内容的哈希值、散列值去校验资源变化,这便是http1.1。在http1.1中,还是会分为强制缓存、协商缓存两种方式,只不过对时间、内容的校验方法做了优化。

  强制缓存:1??客户端请求地址路径第一次获取资源,此时服务器端在响应头中设置放入两个字段:age和Cache-Control。age用来表示资源在客户端缓存中存在了多久,因为是第一次获取到的资源,所以初始化为0。Cache-Control用来表示资源有效期,即它能在客户端缓存中存在多久,例如Cache-Control:max-age=3600 表示3600秒内,缓存中的资源都是有效的可以直接使用的。

        2??在3600秒内,客户端请求相同路径时,强制从缓存获取,并返回状态码200。

        3??一旦资源占据缓存的时间超过3600秒,客户端重新从服务器获取资源,返回状态码200。

  

  协商缓存:1??客户端第一次获取资源时,服务器在返回头放入字段Cache-Control和Etag。此时的Cache-Control与强制缓存的有点不同,不再是max-age和时间段,而是一个字符串固定值"no-cache"。Etag中放入的值一般为资源内容的哈希或者散列值。与返回体中的资源一同返回给客户端,并将其持久化至缓存。

        2??客户端需要再次用到这个地址路径下的资源时,先去缓存中查看该资源的Cache-Control的值,发现为"no-cache",这时客户端知道了,需要先去后台做资源是否发生变化的校验,于是将该资源的Etag值发给后台,这里Etag的字段名发生变化,变成If-None-Match。

        3??后台接收请求旧Etag后与最新的Etag进行比较,若一致,返回304,若不一致,返回200,并在响应体中放一份最新资源,响应头中放一份最新Etag。

        4??强制缓存与协商缓存并存时:即Cache-Control值为"max-age=3600,no-cache",以强制缓存优先。

  

  注:在上图中我们发现1.0和1.1两种写法并存,其实是为了更好的兼容低版本浏览器,因为两个版本各自校验并不冲突。

参考资料:https://www.jianshu.com/p/54cc04190252  

原文地址:https://www.cnblogs.com/jiangxiaoxi/p/11450793.html

时间: 2024-08-29 15:50:33

浏览器缓存机制深入理解与实践(一)的相关文章

浏览器缓存机制浅析

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

浏览器缓存机制

最近在做项目过程中需要对部分文件数据进行缓存,于是整理一些关于浏览器缓存机制的信息 概要总结:1.Expires 过期时间2.Cache-Control 缓存机制 [max-age=300]缓存时间 300 表示5分钟3.Last-Modified 最后修改时间 对应在请求头部有If-Modified-Since4.Etag 唯一标识 由服务器生成 对应在请求头部有If-No-Match优先级:Etag > last-modified > Expires 浏览器缓存机制,其实主要就是HTTP协

浏览器缓存机制(2)-应用缓存

浏览器缓存机制(2)-应用缓存 在公司项目中,一些移动版的WEB页面恰好用到了应用缓存,故顺便写篇文章来总结下应用缓存方面的内容. 1.应用缓存简介 应用缓存(application cache)是HTML5提供的一套缓存机制,使得WEB应用可以离线运行.除了一些旧版本的IE外,现代浏览器如firefox,chrome,safari大部分都是支持HTML5标准的.使用应用缓存主要优势有: 离线浏览:用户可以在离线状态浏览网页内容. 速度更快: 因为数据存储在浏览器缓存中,浏览器只会下载服务器发生

浏览器缓存机制详解

对于浏览器缓存,相信很多开发者对它真的是又爱又恨.一方面极大地提升了用户体验,而另一方面有时会因为读取了缓存而展示了"错误"的东西,而在开发过程中千方百计地想把缓存禁掉.那么浏览器缓存究竟是个什么样的神奇玩意呢? 什么是浏览器缓存: 简单来说,浏览器缓存就是把一个已经请求过的Web资源(如html页面,图片,js,数据等)拷贝一份副本储存在浏览器中.缓存会根据进来的请求保存输出内容的副本.当下一个请求来到的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是

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

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

浏览器缓存机制(1)

浏览器缓存机制之一(经典缓存) 因为在接手的项目中用到过比较新的HTML5应用缓存,也用到了经典的缓存如设置max-age,Etag之类,而之前一直就是在用着没有去深究其中原理.周末天气不好,懒得出去了,正好找时间总结下. 1.关于浏览器缓存 记得去年看<HTTP权威指南>的时候,有一章是专门讲浏览器缓存的,一年时间过得太快,逝去的时光还真是如同人群中消失的好姑娘,眼看她嫁给别人.我这里把浏览器缓存分为经典的浏览器缓存(以下简称为经典缓存)和HTML5应用缓存这两类. 经典的浏览器缓存其实主要

atitit。浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结

atitit.浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结 1. 缓存的一些机制 1 1.1. http 304 1 1.2. 浏览器刷新的处理机制 1 1.3. Expires 2 1.4. Cache-Control 2 1.5. Last-Modified/E-tag 3 1.6. Etag 主要为了解决 Last-Modified 无法解决的一些问题. 4 2. 不同的页面打开方式产生的请求区别 5 3. html  meta法 5 4. http head 法

[转]浏览器缓存机制

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

【转】浏览器缓存机制

最近在做页面分析的时候发现页面F5刷新时,大部分原来已经缓存的内容的状态变成了304,很是不解,原来想好好看看是什么原因的.结果发现园里已经有人分析的很彻底了. 原文地址:浏览器缓存机制 浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires: Cache-control等).但是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下: <META HTTP-EQ