本文介绍: 只要浏览器判断缓存没有过期,则直接使用浏览器本地缓存而无需再请求服务器。如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,。Cachecontrol 选项更多一些,设置更加精细,所以建议使用 Cache-Control实现强制缓存

一、强制缓存

只要浏览器判断缓存没有过期,则直接使用浏览器本地缓存而无需再请求服务器

强制缓存利用下面这两个 HTTP 响应头部(Response Header字段实现的,它们都用来表示资源客户端缓存有效期:

如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,Cache-Control优先级高于 Expires 。

Cache-control 选项更多一些,设置更加精细,所以建议使用 Cache-Control实现强制缓存。具体的实现流程如下

二、协商缓存

服务端协商之后,通过协商结果判断是否使用本地缓存。

协商缓存可以基于两种头部实现

第一种:请求头部中的 If-Modified-Sinc字段与响应头部中的Last-Modified字段

                (基于时间实现)

第二种:请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段

                (基于一个唯一标识实现,能更准确地判断文件内容是否修改)

如果在第一次请求资源的时候服务端返回的 HTTP 响应头部同时有 Etag 和 Last-Modified 字段,那么客户端再下一次请求的时候,如果带上了 ETag 和 Last-Modified 字段信息服务端这时 Etag优先级更高,也就是服务端先会判断 Etag 是否变化了,如果 Etag 有变化就不用在判断 Last-Modified 了,如果 Etag 没有变化,然后再看 Last-Modified。

为什么 ETag 的优先级更高?

这是因为 ETag 主要能解决 Last-Modified 几个比较难以解决问题

  1. 没有修改文件内容情况下文件的最后修改时间可能也会改变,这会导致客户端认为这文件被改动了,从而重新请求;
  2. 可能有些文件是在秒级以内修改的,If-Modified-Since 能检查到的粒度是秒级的,使用 Etag就能够保证这种需求客户端在 1 秒内能刷新多次
  3. 有些服务器不能精确获取文件的最后修改时间。

注意,协商缓存这两个字段都需要配合强制缓存中 Cache-Control 字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求

原文地址:https://blog.csdn.net/qq_61504864/article/details/134783362

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_42648.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注