【缓存】-浏览器缓存

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/galen2016/article/details/81674175

简介

浏览器缓存(Brower Caching)是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档

浏览器缓存请求参数

1、浏览器第一次请求时,会发出一组 HTTP 头,用来指导浏览器如何进行缓存。服务器规定一个资源是否要进行缓存,主要由响应头中的Expires/Cache-Control两个字段来控制。
(1)Expires:http1.0时的规范,它的值为一个绝对时间的GMT格式的时间字符串

(2)Cache-Control:是http1.1时出现的header信息,主要是利用该字段的max-age值来进行判断,它是一个相对时间。其它参数如下:
no-cache:不使用缓存
no-store:直接禁止游览器缓存数据
public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器
private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存

(3)同时启用的时候Cache-Control优先级高

2、Etag/If-None-Match 和 Last_Modified/If-Modify-Since
(1)Last_Modified :http1.0时的规范,它是标识该资源的最后修改时间。当浏览器再次请求该资源时,request的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中协商缓存。若命中,则浏览器返回304响应,并更新缓存中的相应头信息。否则,返回最新的资源内容。

(2)Etag:http1.1时的规范,当浏览器第一次请求一个文件时,服务器会生成并返回一个随机令牌即Etag,通常是文件内容的哈希值或者某个其他指纹码。客户端在下一个请求中通过If-None-Match字段将Etag的值发送给服务器:如果指纹码仍然一致,说明资源未被修改,返回304。如果不一致,说明资源已修改,则返回最新的资源内容。

(3)HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题,例如,一些文件可能会周期性的更改,但是它的内容并不改变

(4)两者是可以一起使用的,服务器会优先验证ETag

强缓存和协商缓存

1、强缓存

用户第二次请求时,浏览器会先获取该资源缓存的header信息,根据Expires/Cache-Control 字段判断请求时间,如果下次请求时间在这个时间以前,则可以直接从缓存中获取资源,不必与服务器进行通信,返回的状态码为200。我们把这种机制称为强缓存。

2、协商缓存

如果用户第二次请求时间超过缓存有效期,浏览器就会发送请求到服务器,由服务器来决定下一步该怎么办,这个过程称为协商缓存

浏览器缓存机制

参考下图:
这里写图片描述

浏览器缓存过程

1、浏览器第一次加载资源,服务器返回200, 浏览器将资源下载下来,把资源和response header相关内容一并缓存。

2、下一次加载时,首先比较cache-control,如果没有超过时间,则命中强缓存,不发送请求,直接读取本地文件(如果不支持http1.1,则使用expires来判断);如果时间已经过期,则发送带有if-none-match和if-modified-since的请求头。

3、服务器接受到请求之后,首先判断etag(资源的内容标识)是否和服务器上文件的etag一致,如果一致,则命中协商缓存,返回304;如果不一致,返回新的资源并带上新的etag值返回200。

4、如果请求中没有etag值,则比较发送来的 if-modified-since 值,如果命中,则返回304,;否则,返回新的资源带上新的last-modified的值并返回状态码200。

用户行为对浏览器缓存的控制

1、地址栏访问,链接跳转是正常用户行为,将会触发浏览器缓存机制;

2、F5刷新,浏览器会设置max-age=0,跳过强缓存判断,进行协商缓存判断;

3、ctrl+F5刷新,跳过强缓存和协商缓存,直接从服务器拉取资源。

……完

猜你喜欢

转载自blog.csdn.net/galen2016/article/details/81674175