一、强缓存
无需与服务器进行任何通讯
缺点:无法知道文件内容是否更新,只根据expores或catch-control属性判断是否返回本地缓存
1.expires实现
① 由httl1.0声明
② 由服务端添加一个时间戳在响应头里
③ 客户端判断当前日期是否大于该时间戳选择是否重新发起请求
缺点: 依赖本地时间,如果客户端修改本地时间则无效
2.catch-control实现
① 由httl1.1声明
② 由服务端添加catch-control:max-age:N属性在响应头里
③ 客户端获取max-age属性,并设置一个时间为N秒的倒计时,在倒计时结束之前,不会再次发气请求
相关属性:
max-age
最长缓存时间
s-maxage
在代理服务器中缓存时长 仅在设置public时生效
no-catch
强制协商缓存 直接跳过强缓存,直接进入协商缓存
no-store
禁止任何缓存 每次请求都会全新请求
public
是否允许代理服务器缓存
private
只允许浏览器缓存
二、协商缓存
在使用本地缓存前,向服务器发起一次get请求判断缓存是否过期,如果过期则重新发起请求更新缓存,如果没过期,则返回本地缓存文件
1.last-modified实现
① 服务器读取文件修改时间
② 把读取出的时间赋给响应头的last-modified 并把上次的last-modified时间赋给last-modified-since
③ 设置catch-control为no-catch
④ 客户端比较last-modified与last-modified-since是否一致
缺点:内容不变也会导致修改时间变化,且如果修改在1秒内完成,则无法发现内容更新
2.Etag实现
服务器为不同的资源进行哈希计算所生成的一个字符串,该字符串类似于文件指纹,只要文件内容编码存在差异,对应的Etag对文件资源进行更精准的变化感知。
强验证
强验证根据资源内容进行生成,能够保证每个字节都相同
弱验证
弱验证则根据资源的部分属性来生成,生成速度快但无法确保每个字节都相同
① 客户端发起请求时,计算生成文件指纹,
② 判断是否存在etag标签 ,如果存在,则把旧的文件指纹赋给if-None-Match ,如果不存在,则把文件指纹赋给etag
③ 客户端判断if-None-Match和etag是否一致,一致则返回304,不一致则返回新的etag并设置catch-control为no-catch
缺点:生成etag需要额外的计算资源,如果文件修改过大或修改频繁,会影响服务器性能