缓存验证流程
如何进行缓存验证
程序示例
test.html
<script src="/script.js"></script>
server.js
const http = require('http');
const fs = require('fs');
http.createServer((req, res) => {
console.log('req come: ', req.url);
if(req.url === '/') {
const html = fs.readFileSync('test.html', 'utf8');
// 默认是下面这个writeHead设置,不写也可以
res.writeHead(200, {
'Content-Type': 'text/html'
});
res.end(html);
}
if(req.url === '/script.js') {
res.writeHead(200, {
'Content-Type': 'text/javascript',
'Cache-Control': 'max-age=2000000000, no-cache', // 设置一个较长的值和no-cache
'Last-Modified': '12345',
'Etag': '666'
});
res.end("alert('script loaded')");
}
}).listen(8000, () => {
console.log('server is running on port 8000');
});
启动程序:$ node server.js
访问:http://localhost:8000/
检查浏览器关于script.js中返回的头信息:Cache-Control, Last-Modified, Etag测试成功
刷新浏览器,通过面板检查发现这个script.js还是发送了请求,并没有从memery cache中读取
而且它的Request Headers请求头上携带了If-Modified-Since:12345, If-Non-Match:666
这样的信息
这就是在服务器设置了Cache-Control:no-cache, 'Last-Modified': '12345', 'Etag': '666'
浏览器在下次发送请求的时候把对应的验证缓存的头信息给带上, 以验证是否需要更新的策略
但是我们发现浏览器的Response是有内容的, 而且我们知道内容并没有任何的更改
这时候我们当然希望服务器不需要返回实际的内容,而是直接从缓存中读取信息
为了更好解释这一策略,我们稍微修改下程序
if(req.url === '/script.js') {
// 通用字段的设置
let ct = 'text/javascript';
let ccv = 'max-age=2000000000, no-cache'; // 设置一个很长的时间, 同时设置no-cache
let lm = '12345'; // 先随便设置一个值, 测试浏览器返回头中是否携带
let et = '666'; // 同上
// 读取请求头信息的判断返回内容
const etag = req.getHeader['if-none-match'];
// 根据请求信息判断返回内容
if(etag === '777') {
// 此条件没有修改,使用缓存设置
res.writeHead(304, {
'Content-Type': ct,
'Cache-Control': ccv,
'Last-Modified': lm,
'Etag': et
});
res.end(""); // 不更新任何东西, 即使返回任何东西,此处都不会真正起作用(不会返回给浏览器客户端),因为设置了304的HTTP Code
} else {
// 更新
res.writeHead(200, {
'Content-Type': ct,
'Cache-Control': ccv,
'Last-Modified': lm,
'Etag': et
});
res.end("alert('script loaded')"); // 返回js脚本内容
}
}
修改完程序,重启服务,刷新浏览器一次进行程序的初始化,当第二次刷新浏览器时(也就是再次请求服务端时)
关于script.js的请求信息中的状态码就变成了304 Not Modified
而且发送请求头上的信息有If-Modified-Since
和If-Non-Match
字段
而且其Response还是之前的内容,和服务端程序中res.end("")
的设置无关(即便设置res.end("xxxyyyzzz")
也还是原来的内容)
如果在浏览器检查面板上勾选上Disable cache, 那么在Request Headers请求头上不会发送任何缓存验证相关的头信息了
这是Chrome浏览器Disable cache的作用
扩展
'Cache-Control': no-store
update_at
用于标识和更新即可