- 如不雅资本产生变更,则须要取得新的资本,并在缓存中调换旧资本。
- 如不雅资本没有产生变更,缓存只须要获取新的响应头,和一个新的过不时光,对缓存中的资本过不时光进行更新即可。
HTTP1.1推荐应用的验证方法是If-None-Match/Etag,在HTTP1.0中则应用If-Modified-Since/Last-Modified。
9.Etag与If-None-Match
Etag是指根据实体内容生成一段hash字符串,标识资本的状况,由办事端产生。浏览器会将这串字符串传回办事器,验证资本是否已经修改,如不雅没有修改,过程如下:
代码示例
var http = require('http');var fs = require('fs');http.createServer(function(req, res) { if (req.url === '/' || req.url === '' || req.url === '/index.html') { fs.readFile('./index.html', function(err, file) { console.log(req.url) //对主文档设置缓存,无效不雅 res.setHeader('Cache-Control', "no-cache, max-age=" + 5); res.setHeader('Content-Type', 'text/html'); res.writeHead('200', "OK"); res.end(file); }); } if (req.url === '/shortcut.png') { fs.readFile('./shortcut.png', function(err, file) { console.log(req.url) res.setHeader('Content-Type', 'images/png'); res.writeHead('200', "OK"); res.end(file); }) } if (req.url === '/cache.png') { fs.readFile('./cache.png', function(err, file) { console.log(req.headers); console.log(req.url) if (!req.headers['if-none-match']) { res.setHeader('Cache-Control', "max-age=" + 5); res.setHeader('Content-Type', 'images/png'); res.setHeader('Etag', "ffff"); res.writeHead('200', "Not Modified"); res.end(file); } else { if (req.headers['if-none-match'] === 'ffff') { res.writeHead('304', "Not Modified"); res.end(); } else { res.setHeader('Cache-Control', "max-age=" + 5); res.setHeader('Content-Type', 'images/png'); res.setHeader('Etag', "ffff"); res.writeHead('200', "Not Modified"); res.end(file); } } }); } }).listen(8888)
10.若何计算Etag值
- ETag值平日由办事器端计算,并在响应客户端请求时将它返回给客户端
- 可以经由过程时光戳就可以最简单的获得ETag头信息;但不建议这么做,这么做和Last-Modified头信息就没什么两样了
- ETag值可所以独一标识资本的任何器械,如持久化存储中的某个资本接洽关系的版本、一个或者多个文件属性,实体头信息和校验值、(CheckSum),也可以计算实体信息的散列值。
- 有时刻,为了计算一个ETag值可能有比较大年夜的价值,此时可以采取生成独一值等方法(如常见的GUID)。
- Apache默认经由过程FileEtag中FileEtag INode Mtime Size的设备主动生成ETag(当然也可以经由过程用户自定义的方法)。
- 因为Etag由办事器构造,所以在集群情况中必定要包管Etag的独一性
11. If-Modified-Since与Last-Modified
这两个是HTTP1.0顶用来验证资本是否过时的请求/响应头,这两个头部都是日期,验证过程与Etag类似,这里不具体介绍。应用这两个头部来验证资本是否更新时,存在以下问题:
- 有些文档资本周期性的被重写,但实际内容没有改变。此时文件元数据中会显示文件比来的修改日期与If-Modified-Since不雷同,导致不须要的响应。
- 有些文档资本被修改了,但修改内容并不重要,不须要所有的缓存都更新(比如代码注释)
12. 总结
- 浏览器端缓存分为200 from cache和304 not modified
- HTTP协定中Cache-Control 和 Expires可以用来设置新鲜度的限值,前者是HTTP1.1中新增的响应头,后者是HTTP1.0中的响应头。
- max-age(单位为s)而Expires指定的是具体的过时日期而不是秒数
- Cache-Control和Expires同时应用的话,Cache-Control会覆盖Expires
- 客户端不消关怀ETag值若何产生,只要办事在资本状况产生变革的情况下将ETag值发送给它就行
- Apache默认经由过程FileEtag中FileEtag INode Mtime Size的设备主动生成ETag(当然也可以经由过程用户自定义的方法)。
- ETag常与If-None-Match或者If-Match一路,由客户端经由过程HTTP头信息(包含ETag值)发送给办事端处理。
- Last-Modified常与If-Modified-Since一路由客户端将Last-Modified值包含在HTTP头信息中发给办事端进行处理。
- 有些文档资本周期性的被重写,但实际内容没有改变。此时文件元数据中会显示文件比来的修改日期与If-Modified-Since不雷同,导致不须要的响应。
13 demo
推荐阅读
与简单的网站比拟,现代应用法度榜样有更多 不合的需求 。然则,浏览器是一个拥有(大年夜部分)固定技巧的平台,并且JavaScript仍然是web应用法度榜样的核心说话;须要在浏览器中运行的任>>>详细阅读
本文标题:前端必须要懂的浏览器缓存机制
地址:http://www.17bianji.com/lsqh/37665.html
1/2 1