8.5浏览器缓存

Posted zjj-study

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.5浏览器缓存相关的知识,希望对你有一定的参考价值。

https://www.jianshu.com/p/54cc04190252

https://www.cnblogs.com/chengxs/p/10396066.html

应用场景还没总结

1. 如果在一个有cookie的页面,再从这个页面的链接跳转,那么在跳转的页面还能拿到cookiesession,但是如果是新开窗口就拿不到session了,因为在同一个页面跳转也属于上一个页面的会话,新开网页就是新的会话了

2. 浏览器缓存

   1. 浏览器是根据http报文的缓存标识进行的

   2. 请求报文和响应报文中都有的请求头和响应头

      1. Cache-ControlConnectionDatePragmaTransfer-EncodingUpgrade

      2. AllowContent-BaseContent-EncodingContent-LanguageContent-LengthContent-LocationContent-MD5Content-RangeContent-TypeEtagExpiresLast-Modifiedextension-header

   3. 缓存过程:浏览器发起请求-----服务器响应请求

      1. 浏览器第一次拿到请求结果------根据响应报文的响应头里面的缓存标识来决定是不是要缓存结果,是的话就存入浏览器缓存中

      2. 所以浏览器每次发请求的时候会现在浏览器缓存中查找同一个请求的结果和标识,每次拿到结果也会将结果和标识放在缓存中

   4. 然后根据是否需要向服务器重新发起http请求将缓存分为强缓存和协商缓存

      1. 强缓存

         1. 强缓存发请求之前根据缓存规则会先去浏览器缓存查找该请求结果

            1. 如果不存在结果和缓存标识就发起请求

            2. 存在但是失效就使用协商缓存

            3. 存在并且没有失效就直接返回结果

         2. 缓存规则在服务器返回的响应头中,控制字段是expirescache-control

            1. expireshttp1.0的字段,指的是服务器返回该请求的结果缓存的到期时间,也就是说再一次发请求的时候,时间还没超过这个值就直接用缓存结果

               控制缓存的原理是用客服端时间和服务端返回的时间做对比,有一方有误差就直接无效所以http1.1cache-control

            2. cache-control是一个相对值,并且优先级高于expires,有多个指令

            https://upload-images.jianshu.io/upload_images/3174701-8ff981603cdfded0?imageMogr2/auto-orient/strip|imageView2/2/w/562/format/webp

              https://upload-images.jianshu.io/upload_images/3174701-3fa81f5e9efac5af?imageMogr2/auto-orient/strip|imageView2/2/format/webp

      2. 协商缓存:强缓存判断是否缓存是根据结果字段是根据时间,但是不知道服务器内容是否更新,所以就要用到协商缓存

         1. 当强缓存失效之后,浏览器携带缓存标识发起请求,由服务器根据标识决定是否使用缓存

            1. 协商缓存生效,返回304not modified

            2. 协商缓存失效,返回200和结果

         2. 协商缓存通过响应头中的last-modifiedif-modified-since设置

            1. last-modified指的是这个请求资源在服务器的最后修改时间,浏览器收到后就缓存结果和指令

            2. 然后再发请求的时候再缓存中找到了这个指令就添加 if-modified-since字段=last-modified的值,

            3. 服务器收到这个请求根据if-modified-since的值与服务器这个资源的最后修改时间做对比,值一样就返回304和空响应主体,浏览器就从缓存读取结果,如果值更小就说明有更新,返回200和新的结果

         3. 但是last-modified的值如果再本地打开了缓存文件会改变所有这个会造成服务器发送同样的资源

      3. etag if-none-match

         1. etag是当前这个请求资源的唯一标识,只要资源有变化就会重新生成

         2. 浏览器再发请求的时候会吧etag放到请求头的If-None-Match中,服务器只需要比较这个etag和服务器这个资源的etag就知道资源是否改变了

         3. 没改变就是304和直接使用缓存,改变就是返回200和新结果

      4. 总结缓存机制:强缓存优先协商缓存(也就是有expriescache-control),强缓存失效就进行协商缓存(last-modifide/if-modified-sinceetag/if-none-match),但是这个是由服务器决定,如果协商缓存失效这个请求的缓存就没有,就直接返回200 和结果标识,然后又存入缓存,--------协商缓存生效就返回304继续使用缓存中的资源

         https://upload-images.jianshu.io/upload_images/3174701-9d9e8b52a18ed35a?imageMogr2/auto-orient/strip|imageView2/2/w/519/format/webp

3.

以上是关于8.5浏览器缓存的主要内容,如果未能解决你的问题,请参考以下文章

浏览器缓存和服务器缓存

基于Nginx设置浏览器协商缓存过程详解

浏览器缓存原理简述

HTTP缓存

Vue 部署上线清除浏览器缓存

为啥在浏览器缓存处理缓存时使用服务工作者进行缓存?