http缓存-协商缓存

148 阅读2分钟

前言:前面介绍了http强缓存,这里继续介绍一下http的协商缓存;

什么是协商缓存?

协商缓存相对于强缓存的不同之处在于,协商缓存在确定使用磁盘缓存之前,需要先向服务端发送一个请求,确定是否可以使用缓存,如果可以使用缓存,浏览器就直接读取缓存并返回。

协商缓存过程

未命名流程图.png

协商缓存标志

Last-Modified & If-Modified-Since

Last-Modified:服务器端返回给客户端当前请求的资源的最后修改时间;

If-Modified-Since:客户端将上一次请求的Last-Modified作为该参数返回给服务器端;

举例:

last-modified: Wed, 28 Apr 2021 18:58:18 GMT
if-modified-since: Wed, 28 Apr 2021 18:58:18 GMT

last-modified是一个服务器的绝对时间,最小单位是S(秒),当服务器文件发生改变,它的值也会跟着变化;但last-modified控制缓存的缺陷在于,当文件改变频率小于S级别时,它将无法识别变化,客户端将继续使用缓存,导致无法及时更新的问题。

etag将解决这个缺陷,下面将提到。

Etag & If-None-Match

etag:服务器端返回根据文件生成的hash值;

if-none-match:客户端将上一次请求的etag作为该参数返回给服务器端;

etag是根据文件生成的hash值,最小有效时间单位是ms(毫秒),将解决last-modified无法识别小于S(秒)级别的文件改变。当服务发现etag值没有改变,将告诉客户端直接使用缓存。

优先级

last-modifiedetag 同时存在时,etag > last-modified;也就是说,etag存在时,last-modified将不生效;

当强缓存生效时,协商缓存将不生效;