六、HTTP协议中的缓存

一、缓存简介

缓存无处不在,浏览器端的缓存、服务器端的缓存、代理服务器的缓存、对象缓存、数据库也有缓存……HTTP中具有缓存功能的是浏览器缓存和代理服务器缓存。下面说一下缓存的优点

1.减少冗余的数据传输,节省了传输时间

2.减少服务器的负担,大大提高了网站的性能

3.加快了客户端加载网页的速度

二、使用Fiddler如何查看缓存的Header

与缓存相关的内容放在Header中的Cache项里;Requests和Responses均是这样。如图:

六、HTTP协议中的缓存

三、缓存的新鲜度(通过什么方式判断其是否最新,如何刷新缓存)

Web服务器通过两种方式判断浏览器缓存是否最新:

(1)浏览器把缓存文件的最后修改时间通过Header“If-Modified-Since”项传递给Web服务器。

(2)浏览器把缓存文件的ETag通过Header“If-None-Match”项传递给Web服务器。

简单描述一下,浏览器端想请求一个文档,它首先检查本地缓存,发现存在这个文档的缓存,获取缓存文档的最后修改时间,发送请求,将值放在Header中的“If-Modified-Since”项传递给Web服务器。Web服务器接收到请求后,将服务器的文档修改时间(Last-Modified)与HTTP请求中的header中的“If-Modified-Since”值相比较,有两种情况,如下面图示:

1.缓存有效:

六、HTTP协议中的缓存

2.缓存无效

六、HTTP协议中的缓存

截图举例:

六、HTTP协议中的缓存

上面说的是If-Modified-Since值对比的方式;下面说一下ETa'g;

四、ETag

ETag(Entity Tag):实体标签;是根据实体内容生成的一段hash字符串(类似MD5之后的结果),可以用来标识资源的状态(当资源发送变化时,ETag也会跟着改变);ETag是Web服务端产生的,然后通过response响应给浏览器。使用ETag,主要解决Last-Modified无法解决的情况:

(1.某些服务器不能精确得到文件的If-Modified-Since来判断文件是否更新;

(2.某些文件修改非常频繁,以小于秒的单元进行修改,而Last-Modified最精确单元为秒;

(3.有些文件最后修改时间变化了,但是内容并没有变化,所以我们不希望浏览器以为文件已变化了;

六、HTTP协议中的缓存

五、与缓存相关的header

字段名称 释义
Cache-Control:max-age=0 以秒为单位
If-Modified-Since:Fri, 11 Jan 2019 01:55:04 GMT 缓存文件的最后修改时间
If-None-Match:W/"5c37f778-732" 缓存文件的Etag的值
Cache-Control:no-cache 不使用缓存
Pragma:no-cache 不使用缓存
Cache-Control:public 响应被缓存,可以共享与多用户
Cache-Control:private 响应只能私有缓存,不可共享
Cache-Control:no-store 绝对禁止缓存(机密、敏感文件)
Cache-Control:max-age=60 60秒后缓存过期(相对时间)
Date:Fri, 11 Jan 2019 01:55:04 GMT 当前发送时间
Expires:Fri, 11 Jan 2019 01:55:04 GMT 缓存过期时间设置(绝对时间)
Last-Modified:Fri, 11 Jan 2019 01:55:04 GMT 服务器端文件的最后修改时间
Etag:W/"5c37f778-732" 服务器端文件的Etag值

六、关于缓存的常识

1.如何让浏览器不使用缓存?

答:【Ctrl+F5】快捷键强制刷新浏览器,让浏览器不使用缓存;此时Fiddler抓包所看到的请求Header中都会带有Cache-Control:no-cache;

六、HTTP协议中的缓存

2.如何让浏览器直接使用缓存,不请求服务器进行缓存验证?

答:第一次访问与第二次访问同一个网页;(注意:第二次访问时,输入网址,直接回车)浏览器会直接使用有效的缓存,而不会发生HTTP请求去服务器验证缓存,这种情况称之为缓存命中

使用Fiddler抓包,现象:第一次访问,有70多个Session;第二次访问,仅40多个请求;

3.浏览器均可在设置中设置不使用缓存;

4.公有缓存、私有缓存的区别:一个可以多个不同的客户端使用,一个只可唯一的客户端使用;