3-5 缓存验证Last-Modified和Etag的使用

当服务端设置了Cache-Control值为no-cache时,当浏览器发起请求时,都需要到服务端进行资源的验证。验证完成后如果确定服务端可以使用缓存,才会读取本地的缓存。


缓存操作流程

last-Modified

last-Modified

Etag

Etag



demo

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带上


你可能感兴趣的:(3-5 缓存验证Last-Modified和Etag的使用)