为什么要使用缓存?
为了减少向服务器请求的量
强制缓存
强制缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存;决定是否使用缓存的主动性在于浏览器这边
强制缓存有两个字段:1.Cache_Control相对时间 2.Expries绝对时间
如果Http头部同时有这两个字段的话,Cach_Control优先级大于Expires;
实现流程:
1.浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在Response(响应)头部加上Cache-Control中设置过期时间大小
2.浏览器再次请求访问服务器中资源时,会先通过请求资源的时间与Cache-Control中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器
3.服务器再次收到响应后,会再次更新Respo头部的Cache-Control;
协商缓存
2024年4月15日
15:47
协商缓存基于强制缓存;在强制缓存到期后生效;
第一种情况:
基于时间:
1.请求头部中的If-Modified-Since字段与响应头中的Last-Modified字段实现;
响应头部中的Last-Modified:表示这个响应资源的最后修改时间;
请求头部字段If-Modified-Since:当资源过期了,发现响应头中有Last-Modified声明,则再次发起请求的时候带上Last-Modified的时间,服务器收到请求后发现有If-Modified-Since则与被请求资源的最后修改时间进行对比,如果最后修改时间较新,说明资源被修改过;则返回最新资源HTTP 200 OK;如果最后修改时间较旧,说明资源无新修改,响应HTTP 304 缓存
第二种情况:
基于一个唯一标识:
请求头部中的If-Modified-Since字段与响应头部中的Last-Modified字段实现:
响应头部中的Last-Modified:表示这个响应资源最后的修改时间;
请求头部中的If-Modified-Since:当资源过期了,发现响应头中具有Etag声明,则再次向服务器发起请求,会将请求头If-None-Match值设置为Etag的值,服务器收到请求后进行对比,如果资源没有变化则返回304,如果资源变化了返回200;
第一种方式基于时间,第二张方式基于一个唯一标识实现,相对来说后者可以更加准确的判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题
如果在第一次请求资源时,服务端返回的HTTP响应头同时有Etag和Last-Modified字段,那么客户端再下一次请求的时候,如果带上了ETag和Last-Modified字段信息给服务器,这时Etag优先级更高,也就是服务器会先判断ETag是否变化了,如果ETag有变化就不用再判断Last-Modified了,如果Etag没有变化,然后再看Last-Modified;
为什么EYag优先级更高?
1.在没有修改文件内容的情况下文件的最后修改时间可能也会改变,这会导致客户端认为这个文件被改动了,而重新请求;
2.可能有些文件在秒级以内修改的,If-Modified-Since能检查的粒度是秒级的,使用ETag就能保证这种需求下客户端在1秒内能刷新多次;
3.有些服务器不能精确获取文件的最后修改时间