1.理解浏览器缓存浏览器缓存分为:强缓存和协商缓存。1、强缓存:浏览器??加载资源时,首先要判断是否是强缓存。如果是这样,浏览器会直接从自己的缓存中读取,不会向服务器发送请求。上图中,status200,Size来自内存缓存,是强缓存。那么什么是强缓存呢?浏览器如何判断?Expires字段:1、浏览器第一次请求服务器,服务器返回资源并在响应头中加入Expires字段,是客户端缓存的有效期,是一个绝对时间。2.浏览器接收资源并缓存资源和对应的header。3、再次请求资源时,先到缓存中查找,如果找到了,再查看Expires字段,判断是否过期。如果还没有过期,直接从缓存中加载。如果过期,再次向服务器请求。但是绝对时间有时会出现偏差,所以引入了Cache-Control。Cache-Control字段:1.浏览器第一次请求服务器,服务器返回资源并在响应头中加入Cache-Control字段,这也是缓存的有效期,不过是相对时间,例如:Cache-Control:max-age=56700000。2.浏览器收到资源,缓存资源和对应的header。3、当浏览器再次请求这个资源时,先到缓存中查找,根据第一次请求时间和Cache-Control的相对时间计算过期时间。如果还没有过期,直接从缓存中加载。如果过期,再次向服务器请求。Cache-Control弥补了Expires的不足,更加安全有效。2、协商缓存:当浏览器判断自己不是强缓存时,会向服务器发送请求判断是否是协商缓存。如果是,服务器将返回304NotModified,浏览器将从缓存中加载它。那么什么是协商缓存呢?Last-Modified和If-Modified-Since字段:1、浏览器第一次向服务器发送请求,服务器返回资源并在响应头中添加Last-Modified字段,表示资源被修改的时间上次修改。2、当浏览器再次请求该资源时,会在请求头中添加If-Modified-Since字段。如果这两个字段相同,则表示资源没有被修改,返回304NotModified,浏览器从缓存中获取资源。如果这两个字段不同,说明资源被修改,服务器正常返回资源。但是有时候服务器上的资源发生变化,列表的最后修改时间没有更新,那么就会产生下面两个字段。ETag、If-None-Match:1、浏览器第一次请求服务器,服务器返回资源并在响应头中加入ETag字段。指示资源本身。如果资源发生变化,该字段将发生变化。2、当浏览器再次向服务器请求该资源时,请求头中携带If-None-Match字段。如果这两个字段相同,说明资源没有变化,服务器返回304NotModified,浏览器从缓存中加载。如果两个字段不同,则证明资源发生变化,服务器正常返回资源。
