1.强制缓存主要取决于两个字段 Expires 和 Cache-Control 中的 max-age 字段,在时间有效期内如果设置了Expires强制缓存,则后续的请求直接从缓存(内存中)读取,不在进行服务端请求。
2. 协商缓存:状态码304,能够解决在强制缓存资源不更新的问题。(换而言之:在时间有效期内,还想在服务端进行请求最新的资源。)
Cache-Control :
max-age:缓存过期时间
no-cache(协商缓存)
no-store:不协商缓存
public:支持代理服务器缓存
private:不支持代理服务器缓存
协商缓存主要由 ETag 和 Last-Modified 两个字段来实现
ETag 是一个用于映射 web 资源的映射 token,这个 token 应该满足唯一对应到一 个web服务器上的静态资源(具体实现通常是提取文件相关信息进行hash和base64编码等操作)
默认情况下, 浏览器会优先考量强制缓存的情况, 当强制缓存生效的情况下, 请求并不会到达服务器, 因此也就不会触发协商缓存。 当强制缓存失效的时候, 浏览器便会将请求传递到服务器, 于是服务器又会开始校验 If-Modified-Since 和 If-None-math 两个字段, 重复上述协商缓存的一个执行流程.
以下是nodejs下的服务端ETag实现协商缓存
import ETag frpm 'Etag'
var data='我是服务端数据资源';
const pwd=ETag(data);//加密 类似token
const ifNoneMatch=req.header['if-none-match']//判断是否一致
if(ifNoneMatch===pwd){
res.statusCode=304;//协商缓存 不进行请求 直接读取内存的资源
res.end();
retrun;
}
res.setHeader('etag',pwd); //设置etag标识
res.setHeader('cache-control',no-cache);//设置协商缓存
res.end(data);