强缓存和协商缓存是Web开发中常用的两种缓存策略
- 用于提高网页加载速度
- 减少服务器负载
(好处的具体原因不再赘述)
重点:想要学好他们到底是什么,我们自己设置一遍基本就全懂了。(不过我全凭想象)
强缓存
使用cache-control和expires两个字段,强缓存无需后端配合
Cache-Control
- public:该值表示响应可以被任何缓存,包括中间的代理服务器以及客户端进行缓存。
- private:该值表示响应只能被用户自己的缓存进行存储,不能被代理服务器缓存。
- no-cache:该值表示需要向服务器发送请求来验证缓存的响应是否有效。使用该值时,浏览器会先发送请求到服务器,然后在返回响应之前,浏览器会检查是否有更新的版本。
- max-age:该值表示在这个时间段内,如果浏览器再次请求同样的资源,浏览器会直接从缓存中获取,而不需要向服务器发送请求。
- must-revalidate:该值表示如果缓存的响应已经过期,那么必须向服务器发送请求获取新的响应。
当本地浏览器有该资源的缓存,比如上一次的响应中Cache-Control的字段设置的是允许缓存,那么在有效期我们再次请求时,就会直接命中本地缓存;
那如何判断有效?
优先级:(Cache-Control 的 max-age) > Expires > Last-Modified === Etag
Expires(Expires对应的时间是格林尼治时间,转换为中国时间应该为GMT+8)
Cache-Control 的 max-age(max-age 指令来指定缓存过期的相对时间)
即,如果Expires存在,Cache-Control 的 max-age 指令优先级高于 Expires;当 Cache-Control 的 max-age 指令不存在时,Expires 的优先级会提高。
并且Expires 的优先级高于 Last-Modified 和 Etag
协商缓存
响应上会带有Last-Modified和Etag,这两个标识一个代表了资源的上次修改时间、一个代表了资源的唯一标识符
优先级:Last-Modified === Etag
下次请求的请求头的例子:
If-None-Match:上次响应发过来的Etag
If-Modified-since: 上次响应发过来的last-modified
客户端向服务器发送请求来验证缓存数据是否有效,需要后端配合
至于200和304,没过期就304;过期了就响应里带数据并且响应码为200呗。
我们简单看一个例子,体会一下:
在请求的Cache-Control头中设置no-cache,表示该请求不允许从缓存中获取响应,而是需要向服务器重新发起请求,获取最新的数据。
而Access-Control-Allow-Headers中的No-Cache只是表示该响应不得被缓存,每次请求都需要从服务器获取最新的数据 那多余的配置着实让我有点看不懂了(这是哔哩哔哩里的一个请求例子)
Access-Control-Allow-Headers
Access-Control-Allow-Headers是CORS(跨域资源共享)中的一个重要参数,它用于指定实际请求所允许的头部信息。
当一个跨域请求发送时,浏览器会附带一些头部信息,例如Authorization、Content-Type等。这些头部信息对于请求的认证、数据的描述等方面非常重要。然而,由于跨域的限制,浏览器在发送请求之前会检查服务器是否允许这些头部信息的发送。
在响应中设置Access-Control-Allow-Headers,可以告诉浏览器哪些头部信息是允许发送的。这样,浏览器就可以在请求时携带相应的头部信息,从而实现了跨域请求的功能。
例如,如果响应中设置Access-Control-Allow-Headers为Content-Type、Authorization,那么浏览器就知道在跨域请求时可以携带Content-Type和Authorization头部信息。
需要注意的是,Access-Control-Allow-Headers的值可以是一个逗号分隔的列表,包含多个头部信息。同时,如果请求中携带了其他未在Access-Control-Allow-Headers中指定的头部信息,那么该请求可能会被拒绝。因此,在实际应用中需要根据实际情况设置Access-Control-Allow-Headers的值。