当前位置:

HTTP缓存,浏览器缓存

xiaoming 2022-12-20 254 0

setHeader("last-modified", mtime.toUTCString())    res.setHeader("Cache-Control", "no-cache")    res.end(data)  }}...

上面的 last-modified 配合 If-Modified-Since在使用时有些弊端,例如将03.jpg修改成04.jpg,再改回03.jpg。此时这个文件其实是没有变化的,但是最后修改时间更改了,因此客户端就需要重新请求,因此就出现了下面的第二种使用Etag的方式

第二种:Etag 配合 If-None-Match

HTTP缓存,浏览器缓存

Etag实现的方式服务端是为文件生成一个指纹,类似于MD5字符串。接着响应头中塞进 Etag 参数,参数的值就是计算出的字符串,客户端接收到后,第二次请求会带上一个 If-None-Match 的参数,接着服务端和上面第一种方式一样进行比对,nodejs的实现代码如下:

// 引入 etag 模块const etag = reqiure("etag")...if(pathname === '/img/03.jpg') {  const data = fs.readFileSync("./img/03.jpg")  // 获取生成的etag字符串  const etag = etag(data)  // 判断客户端发送的 If-None-Match 与服务端是否一致  if(req.headers['if-none-match'] === etag) {    res.statusCode = 304    res.end()  } else {    // 如果不一致,那么就请求最新的资源返回给客户端    const data = fs.readFileSync("./img/03.jpg")    // 这2句代码是设置协商缓存    res.setHeader("etag", etag)    res.setHeader("Cache-Control", "no-cache")    res.end(data)  }}...


发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~
您是本站第4381名访客 今日有0篇新文章