当服务端设置了Cache-Control值为no-cache时,当浏览器发起请求时,都需要到服务端进行资源的验证。验证完成后如果确定服务端可以使用缓存,才会读取本地的缓存。
缓存操作流程
last-Modified
last-ModifiedEtag
Etagdemo
const http=require('http');
const fs=require('fs')
http.createServer(function(request,response){
if (request.url==='/') {
const html=fs.readFileSync('test.html','utf8')
response.writeHead(200,{
'Content-Type':'text/html'
})
response.end(html)
};
if (request.url==='/script.js') {
const etag=request.headers['if-none-match']
if (etag==='777') {
response.writeHead(304,{
'Content-Type':'text/javascript',
'Cache-Control':'max-age=30000000,no-cache',
'Last-Modified':'123',
'Etag':'777'
})
response.end('')
}else{
response.writeHead(200,{
'Content-Type':'text/javascript',
'Cache-Control':'max-age=30000000,no-cache',
'Last-Modified':'123',
'Etag':'777'
})
response.end('console.log("script loaded!")')
}
};
}).listen(8888)
console.log('server listening on 8888')
第一次加载携带了Etag值
第二次加载为304,意味着是从缓存中读取的
总结
Cache-control:nocache 可以在发起端缓存但要在服务端进行验证是否可以缓存
last-modified:上次修改时间
if-modified-since
in-unmodified-since
服务器读取这两个值,看资源是否重新修改,服务器告诉客户端是否可以用缓存的资源
etag
数据签名
数据修改,资源的数据签名就会修改
例如hash
两个属性:
if-match
if-non-match
里面放的etag值,对比服务端和客户端判断是否使用缓存
304
如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个304状态码。简单的表达就是:客户端已经执行了GET,但文件未变化。
no-store
没有缓存
设置了etag、last-modified后,浏览器在第二次发起请求后就会把if-none-match和if-modified-since带上
网友评论