写点什么

【前端 · 面试 】HTTP 总结(九)—— HTTP 协商缓存

用户头像
编程三昧
关注
发布于: 7 小时前
【前端 · 面试 】HTTP 总结(九)—— HTTP 协商缓存

最近我在做前端面试题总结系列,感兴趣的朋友可以添加关注,欢迎指正、交流。

争取每个知识点能够多总结一些,至少要做到在面试时,针对每个知识点都可以侃起来,不至于哑火。


前言

通过前面的介绍,我们知道 HTTP 缓存分为两种:


  • 强缓存

  • 协商缓存



在上一篇文章中,我们了解了 HTTP 强缓存,今天我们来了解一下协商缓存相关的内容。

协商缓存

特点

协商缓存,也称为对比缓存。


协商缓存机制下,浏览器需要发送缓存标识,去向服务器验证缓存标识是否有效,进而判断是重新发起请求、下载完整的响应,还是从本地获取缓存的资源。


如果服务端提示缓存资源未改动(Not Modified),资源会被重定向到浏览器缓存,这种情况下网络请求对应的状态码是 304,比如:


规则

协商缓存的整体规则如下所示:



从上图可以看出,虽然客户端仍然发起了 http 请求服务器,但是服务器只做了标志对比来确认是否使用缓存,如果确认使用缓存,就不会再返回具体的资源了。这样做虽然没有减少请求数量,但是极大减小了请求负荷,可以明显提升请求速度和减小网络带宽。


上图是缓存标识正常有效的时序图,但其实协商缓存的验证结果也存在两种情况:


  • 标识有效

  • 标识过期


协商缓存需要配合强缓存使用,使用协商缓存需要先设置 Cache-Control:no-cache 或者 pragma:no-cache 来告诉浏览器不走强缓存。

标识过期

属性

对于对比缓存来说,缓存标识的传递是我们着重需要理解的,它在请求 header 和响应 header 间进行传递,一共分为两种标识传递:


  • Last-Modified / If-Modified-Since

  • Etag / If-None-Match

Last-Modified / If-Modified-Since

Last-Modified/If-Modified-Since 是 HTTP 1.0 引入的,它的值代表的是文件的最后修改时间


第一次请求服务端会把资源的最后修改时间放到 Last-Modified 响应头中,第二次发起请求的时候,请求头会带上上一次响应头中的 Last-Modified 的时间,并放到 If-Modified-Since 请求头属性中,服务端根据文件最后一次修改时间和 If-Modified-Since 的值进行比较,如果相等,返回 304 ,并加载浏览器缓存。

Etag / If-None-Match

ETag/If-None-Match 的值是一串 hash 码,代表的是一个资源的标识符,当服务端的文件变化的时候,它的 hash 码会随之改变,通过请求头中的 If-None-Match 和当前文件的 hash 值进行比较,如果相等则表示命中协商缓存。


ETag 又有强弱校验之分,如果 hash 码是以 "W/" 开头的一串字符串,说明此时协商缓存的校验是弱校验的,只有服务器上的文件差异(根据 ETag 计算方式来决定)达到能够触发 hash 值后缀变化的时候,才会真正地请求资源,否则返回 304 并加载浏览器缓存。

总结

以上就是 HTTP 协商缓存的相关内容。(电脑没电了,没带充电器,等明天充上电了再完善,见谅!!)


~


~本文完,感谢阅读!


~


学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

大家好,我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

你来,怀揣期望,我有墨香相迎! 你归,无论得失,唯以余韵相赠!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

发布于: 7 小时前阅读数: 4
用户头像

编程三昧

关注

学习有趣的知识,塑造有趣的灵魂! 2019.08.30 加入

还未添加个人简介

评论

发布
暂无评论
【前端 · 面试 】HTTP 总结(九)—— HTTP 协商缓存