>[danger]http缓存(或者叫强缓存和协商缓存),字段 浏览器缓存是一种优化Web应用性能的技术,可以减少对服务器资源的请求,提高页面加载速度。浏览器缓存主要分为强缓存和协商缓存两种方式。 1. 强缓存: - 强缓存是通过在HTTP响应头中设置缓存策略来实现的。 - 当浏览器发送请求时,会检查响应头中的缓存策略(例如Expires和Cache-Control)来确定是否使用缓存。 - 如果缓存策略生效,浏览器直接从本地缓存中获取资源,并且不会向服务器发送请求。 - 强缓存的好处是能够快速加载资源,减少网络请求,但是缺点是如果服务器上的资源发生变化,浏览器无法及时获取到最新的资源。 2. 协商缓存: - 协商缓存是通过在HTTP请求头(If-Modified-Since和If-None-Match)和响应头(Last-Modified和ETag)中进行通信来实现的。 - 当浏览器发送请求时,会携带上次获取资源时的缓存标识(例如上次的修改时间或者ETag)。 - 服务器收到请求后,会与资源的当前状态进行比较。 - 如果资源没有发生变化,服务器返回304 Not Modified状态码,告诉浏览器可以使用缓存。 - 如果资源发生了变化,服务器返回新的资源,并携带新的缓存标识。 - 协商缓存的好处是能够及时获取到最新的资源,但是缺点是需要与服务器进行通信,增加了请求和响应的开销。 区别: - 强缓存是根据缓存策略直接从本地缓存中获取资源,不会发送请求到服务器,而协商缓存需要与服务器进行通信,发送请求并接收响应。 - 强缓存适用于资源已经完全静态且不会频繁更新的情况,可以提供更快的加载速度。而协商缓存适用于动态资源或者需要频繁更新的情况,可以及时获取到最新的资源。 - 如果强缓存生效,浏览器不会向服务器发送请求,响应状态码为200;如果协商缓存生效,服务器会返回304 Not Modified状态码,浏览器继续使用缓存。 - 强缓存的缓存策略由服务器设置,协商缓存的缓存策略由服务器和浏览器共同协商确定。 综合使用强缓存和协商缓存可以提高Web应用程序的性能,减少对服务器资源的请求,并提供更快的加载速度。 >[danger]字段 以下是浏览器强缓存和协商缓存中各自常用的字段: | 强缓存字段 | 协商缓存字段 | |---------------------|-------------------------| | Expires | Last-Modified | | Cache-Control | ETag | | | If-Modified-Since | | | If-None-Match | **强缓存主要使用**:Expires和Cache-Control字段来控制缓存行为。Expires字段指定了资源的过期时间,而Cache-Control字段提供了更灵活和精确的缓存策略控制,包括max-age(缓存有效期)、no-cache(不直接使用缓存,需要与服务器进行协商验证)等。 **协商缓存主要使用**:Last-Modified、ETag、If-Modified-Since和If-None-Match字段来进行验证和协商。Last-Modified字段表示资源的最后修改时间,ETag字段为资源分配了一个唯一的标识符。当浏览器发起请求时,可以将上次请求时获取的Last-Modified和ETag值包含在请求头中,分别使用If-Modified-Since和If-None-Match字段进行验证,与服务器进行协商判断资源是否有更新。 需要注意的是,并不是所有的字段都同时使用,具体使用哪些字段取决于服务器和浏览器的实现。**在实际应用中,通常会选择使用Cache-Control和ETag字段来控制缓存行为和进行协商验证,因为它们提供了更精确的控制和判断资源是否更新的方式**。 >下面是浏览器强缓存和协商缓存中各自能用到的字段以及其含义的解释: | 字段 | 含义及作用 | |---------------------|------------------------------------------------------------------------------------------------------------------------------| | Expires | 指定资源的过期时间。服务器在响应头中设置该字段,告诉浏览器资源的过期时间。如果当前时间小于过期时间,则直接使用缓存的资源,否则重新请求。 | | Cache-Control | 控制缓存行为的指令。通过该字段,服务器可以告知浏览器如何处理缓存。常见的指令包括max-age(缓存有效期)、no-cache(不直接使用缓存,需要协商验证)等。 | | Last-Modified | 资源的最后修改时间。服务器在响应头中设置该字段,标识资源的最后修改时间。浏览器可以将该值存储,并在下次请求时发送给服务器进行协商验证。 | | ETag | 资源的唯一标识符。服务器在响应头中设置该字段,用于唯一标识资源的版本。浏览器可以将该值存储,并在下次请求时发送给服务器进行协商验证。 | | If-Modified-Since | 上次请求资源时的Last-Modified值。浏览器在请求头中设置该字段,用于与服务器进行协商验证,判断资源是否有更新。如果没有更新,服务器返回304 Not Modified状态码。 | | If-None-Match | 上次请求资源时的ETag值。浏览器在请求头中设置该字段,用于与服务器进行协商验证,判断资源是否有更新。如果没有更新,服务器返回304 Not Modified状态码。 | | 200 OK | 表示请求成功,返回的是新的资源。若服务器返回该状态码,表明资源未使用缓存,浏览器会将新的资源保存到缓存中,并使用该资源。 | | 304 Not Modified | 表示资源未发生变化,可以使用缓存的旧资源。如果服务器确定资源未修改,返回该状态码,浏览器会从缓存中加载资源,并继续使用该资源。 |