HTTP强制缓存与对比缓存

强制缓存

1.请求数据流程
  • 浏览器请求数据→已有缓存数据→直接使用缓存数据
  • 浏览器请求数据→无缓存数据→向服务器请求数据→将数据和规则存入缓存
2.如何判断是否过期

强制缓存是否过期由时间判断,主要通过Expire和cache-control两个规则字段。
期中Expire是HTTP1.0下的标准字段,已经过时。

  • cache-control是HTTP消息头,常用取值和意义如下:
    private:客户端可以缓存
    public:客户端和服务器都可以缓存
    max-age=xxx:表示缓存数据于XXX秒后失效
    no-cache:表示缓存数据需要对比缓存来验证
    no-store:不缓存内容,强制缓存、对比缓存都不触发
    在这里插入图片描述
    在这里插入图片描述

对比缓存

1.请求数据流程
  • 缓存命中:浏览器获取缓存数据的标识→请求服务器验证缓存标识对应的数据是否失效→通知浏览器数据未失效→获取缓存数据
  • 缓存未命中:浏览器获取缓存数据的标识→请求服务器验证缓存标识对应的数据是否失效→返回最新的数据和缓存规则
2.如何判断是否过期

浏览器第一次访问网页返回的状态码为200,第二次访问且对比缓存生效状态码为304。
对比缓存有两种状态标识,在request-header和response-header之间传递:
1.Last-Modified/Last-Modified-Since

  • Last-Modified 字段表示资源最后修改的时间(服务器上文件修改的时间),位于response-header中。

在这里插入图片描述

  • Last-Modified-Since 字段位于request-header中表示上次请求时,资源最后修改的时间(本地文件修改的时间)。这个时间发送给服务器进行比较,如果修改过了返回200,如果没修改过返回304直接使用缓存。
    在这里插入图片描述
    2.ETag
     ETag是服务器返回的资源标识符,当资源发生变化时ETag的值也会发生变化,借此可以判断资源是否发生改变。
    为什么有了Last-Modified/Last-Modified-Since还要有ETag?
    1.Last-Modified/Last-Modified-Since的修改时间只能精确到秒,如果文件在一秒内被修改多次,那么仅靠时间对比无法出区分新旧。
    2.一些服务器不能精确得到文件的最后修改时间
    3.一些文件会定时刷新,但是内容并不变。使用Last-Modified/Last-Modified-Since判断就无法使用缓存。

猜你喜欢

转载自blog.csdn.net/qq_38071854/article/details/88664466