强缓存和协商缓存

强缓存和协商缓存
最新回答
白云下的棉絮

2023-01-06 05:44:31

强缓存和协商缓存

一、强缓存

强缓存是指浏览器在请求资源时,会先检查资源的缓存策略,如果资源在缓存有效期内,则直接从缓存中读取资源,而不会向服务器发送请求。强缓存主要通过以下两个HTTP响应头字段来实现:

  • Expires:这是HTTP 1.0的规范,用于指定资源的过期时间。它是一个GMT格式的字符串,表示资源在何时过期。如果客户端的时间小于该时间,则认为资源有效,可以直接从缓存中读取。然而,由于客户端和服务器的时间可能存在差异,因此使用Expires可能会导致一些问题。

  • Cache-Control:这是HTTP 1.1的规范,用于更精确地控制缓存策略。其中,max-age字段指定了资源在缓存中的最大有效时间(以秒为单位)。如果资源在max-age指定的时间内,则直接从缓存中读取,而不会向服务器发送请求。此外,Cache-Control还可以设置其他值,如no-cache(表示资源可以被缓存,但每次都需要向服务器验证是否有效)、no-store(表示资源不能被缓存)等。

注意:如果Expires和Cache-Control同时出现,Cache-Control的优先级高于Expires。因此,在实际应用中,建议使用Cache-Control来控制缓存策略。

二、协商缓存

协商缓存是指浏览器在请求资源时,会先向服务器发送一个带有验证信息的请求,服务器会根据这个验证信息来判断资源是否发生了改变。如果资源没有改变,则服务器会返回一个304状态码,告诉浏览器可以直接从缓存中读取资源;如果资源发生了改变,则服务器会返回新的资源和更新后的缓存策略。协商缓存主要通过以下两个HTTP请求/响应头字段来实现:

  • Last-Modified:这是服务器在响应头中返回的一个字段,表示资源的最后修改时间。当浏览器再次请求该资源时,会在请求头中携带If-Modified-Since字段,其值为上一次请求时服务器返回的Last-Modified值。服务器会比较这两个时间值,如果资源没有修改,则返回304状态码;如果资源有修改,则返回新的资源和更新后的Last-Modified值。

  • ETag:ETag是服务器为资源生成的一个唯一标识符,它可以是资源的哈希值、时间戳或其他唯一值。当浏览器首次请求资源时,服务器会在响应头中返回ETag值。当浏览器再次请求该资源时,会在请求头中携带If-None-Match字段,其值为上一次请求时服务器返回的ETag值。服务器会比较这两个ETag值,如果资源没有修改,则返回304状态码;如果资源有修改,则返回新的资源和更新后的ETag值。

总结

  • 强缓存是通过设置资源的过期时间来实现的,如果资源在缓存有效期内,则直接从缓存中读取资源,而不会向服务器发送请求。
  • 协商缓存是通过在请求头中携带验证信息来实现的,服务器会根据这个验证信息来判断资源是否发生了改变,并返回相应的状态码和资源。

图片展示

以上就是对强缓存和协商缓存的详细解释。