其他分享
首页 > 其他分享> > 前端面经 http缓存机制:强缓存(expires和cache-control)、协商缓存(Etag/If-None-Match和Last-Modified/If-Modified-Since)

前端面经 http缓存机制:强缓存(expires和cache-control)、协商缓存(Etag/If-None-Match和Last-Modified/If-Modified-Since)

作者:互联网

关于强缓存和协商缓存

为什么需要缓存机制

缓存机制的定义: 浏览器在用户的本地磁盘存储了用户最近请求的资源。当用户再次请求同一资源时,浏览器直接从本地磁盘读取资源即可。

缓存的过程

第一次缓存

浏览器发送第一次请求时,本地是没有缓存的;
故向服务器发送请求;
服务器响应请求
在这里插入图片描述
图源于网络

注意:在第一次请求后,服务器会返回两个关键标识给客户端

再次请求

在这里插入图片描述
图源于网络

对照上图来看,当浏览器再次发送请求时,有如下步骤:

强缓存(Expires/Cache-Control)

强缓存是利用http头的Expires和Cache-Control两个字段来控制的。

Expires

Expires值代变这个资源的失效时间。即只要发送的请求在这个时间之前,那么资源是有效的,可以使用本地缓存。即本地缓存还没有过期,资源尚未失效。

Cache-Control

Cache-Control:max-age = 3600,代表资源的有效期是3600秒

Cache-Control有几个常用的可使用值:

注意: 强缓存中,当Expires和Cache-Control同时出现时,Cache-Control的优先级更高!!

协商缓存(Etag/If-None-Match和Last-Modified/If-Modified-Since)

协商缓存需要两组标识去判断

Last-Modified/If-Modified-Since

上文已经说过,当第一次访问请求的时候,服务器会返回一个最后修改时间Last-Modified给浏览器。当浏览器再次请求时,会在request的header上附加一个If-Modified-Since的header,这个If-Modified-Since就是上一次请求返回的Last-Modified的值。
服务器拿着浏览器发送过来的If-Modified-Since与服务器上的最后修改时间进行比对。

Etag/If-None-Match

与Last-Modified/If-Modified-Since同理。
只不过Etag是资源的唯一标识,如果资源发送变化,那Etag就会变化。

不同的是,服务器返回304时,不会返回新的Last-Modified,但是会返回新的Etag(因为Etag重新生成了)。

为什么明明依靠Last-Modified,就可以判断资源是否有修改,还需要一个Etag??

Etag的必要性:

需要注意的是:

Etag/If-None-Match 和 Last-Modified/If-Modified-Since 成对出现,一起作用。但是服务器会优先验证Etag,一致地情况下再进一步验证Last-Modified。综合考虑后,再决定是要返回304还是200.

标签:control,缓存,Last,请求,Since,Modified,Etag
来源: https://blog.csdn.net/qq_43263320/article/details/114623987