因最近项目中踩了一些缓存的坑,来总结一下,cache-control的配置。

Cache-Control的配置:

“no-cache”和“no-store”

“no-cache”表示必须先与服务器确认返回的响应是否发生了变化,然后才能使用该响应来满足后续对同一网址的请求。 因此,如果存在合适的验证令牌 (ETag),no-cache 会发起往返通信来验证缓存的响应,但如果资源未发生变化,则可避免下载。

相比之下,“no-store”则要简单得多。 它直接禁止浏览器以及所有中间缓存存储任何版本的返回响应,例如,包含个人隐私数据或银行业务数据的响应。 每次用户请求该资产时,都会向服务器发送请求,并下载完整的响应。

“public”与 “private”

如果响应被标记为“public”,则即使它有关联的 HTTP 身份验证,甚至响应状态代码通常无法缓存,也可以缓存响应。 大多数情况下,“public”不是必需的,因为明确的缓存信息(例如“max-age”)已表示响应是可以缓存的。

相比之下,浏览器可以缓存“private”响应。 不过,这些响应通常只为单个用户缓存,因此不允许任何中间缓存对其进行缓存。 例如,用户的浏览器可以缓存包含用户私人信息的 HTML 网页,但 CDN 却不能缓存。

“no-cache”和“max-age”

请注意no-cache指令很多人误以为是不缓存,这是不准确的,no-cache的意思是可以缓存,但每次用应该去想服务器验证缓存是否可用。no-store才是不缓存内容。另外部分指令也可以组合使用。

指令指定从请求的时间开始,允许提取的响应被重用的最长时间(单位:秒)。 例如,“max-age=60”表示可在接下来的 60 秒缓存和重用响应。

1、“no-cache”和“max-age”,通过 ETag 验证缓存的响应

  • 服务器使用 ETag HTTP 标头传递验证令牌。
  • 验证令牌可实现高效的资源更新检查:资源未发生变化时不会传送任何数据。

假定在首次提取资源 120 秒后,浏览器又对该资源发起了新的请求。 首先,浏览器会检查本地缓存并找到之前的响应。 遗憾的是,该响应现已过期,浏览器无法使用。 此时,浏览器可以直接发出新的请求并获取新的完整响应。 不过,这样做效率较低,因为如果资源未发生变化,那么下载与缓存中已有的完全相同的信息就毫无道理可言!

这正是验证令牌(在 ETag 标头中指定)旨在解决的问题。 服务器生成并返回的随机令牌通常是文件内容的哈希值或某个其他指纹。 客户端不需要了解指纹是如何生成的,只需在下一次请求时将其发送至服务器。 如果指纹仍然相同,则表示资源未发生变化,您就可以跳过下载。

在上例中,客户端自动在“If-None-Match” HTTP 请求标头内提供 ETag 令牌。 服务器根据当前资源核对令牌。 如果它未发生变化,服务器将返回“304 Not Modified”响应,告知浏览器缓存中的响应未发生变化,可以再延用 120 秒。 请注意,您不必再次下载响应,这节约了时间和带宽。

作为网络开发者,您如何利用高效的重新验证?浏览器会替我们完成所有工作: 它会自动检测之前是否指定了验证令牌,它会将验证令牌追加到发出的请求上,并且它会根据从服务器接收的响应在必要时更新缓存时间戳。 我们唯一要做的就是确保服务器提供必要的 ETag 令牌。 检查您的服务器文档中有无必要的配置标记。

2. “no-cache”和“max-age” 协商缓存阶段

ETagLast-Modified利用这两个字段浏览器可以进入协商缓存阶段,当浏览器再次试图访问这个CSS文件,发现缓存过期,于是会在本次请求的请求头里携带If-Moified-SinceIf-None-Match这两个字段,服务器通过这两个字段来判断资源是否有修改,如果有修改则返回状态码200和新的内容,如果没有修改返回状态码304,浏览器收到200状态码,该咋处理就咋处理(相当于首次访问这个文件了),发现返回304,于是知道了本地缓存虽然过期但仍然可以用,于是加载本地缓存。然后根据新的返回的响应头来设置缓存。(这一步有所差异,发现不同浏览器的处理是不同的,chrome会为304设置缓存,firefox则不会)?

具体两个字段携带的内容如下(分别和上面的Last-ModifiedETag携带的值对应):

If-Moified-Since: Tue, 28 Nov 2017 05:14:02 GMT
If-None-Match: W/"5a1cf09a-63c6"

到这协商缓存结束。

3、max-age=0 和 no-cache有什么不同

max-age=0no-cache应该是从语气上不同。max-age=0是告诉客户端资源的缓存到期应该向服务器验证缓存的有效性。而no-cache则告诉客户端使用缓存前必须向服务器验证缓存的有效性。

对飞行前请求的响应未通过访问控制检查:它没有http ok状态。_HTTP 缓存相关推荐

  1. 对飞行前请求的响应未通过访问控制检查:它没有http ok状态。_对不起,看完这篇HTTP,真的可以吊打面试官...

    点击上方"码农沉思录",选择"设为星标" 优质文章,及时送达 HTTP 内容协商 什么是内容协商 在 HTTP 中,内容协商是一种用于在同一 URL 上提供资源 ...

  2. 对预检请求的响应未通过访问控制检查

    本文翻译自:Response to preflight request doesn't pass access control check I'm getting this error using n ...

  3. 为何看完这篇RxHttp Http请求框架会觉得如此销魂,全文干货建议收藏!

    前言 RxHttp相较于retrofit,功能上,两者均能实现,并无多大差异,更多的差异体现功能的使用上,也就是易用性,如对文件上传/下载/进度监听的操作上,RxHttp用及简的API,可以说碾压re ...

  4. 看完这篇文章前千万别做微信营销

    不是经常在朋友圈被微信卖货的人刷屏?是不是经常在网上看到微信创业的人月入过万?一夜之间,全世界的人都好像在做微信营销,赚的盆满钵满,你是不是蠢蠢欲动?可大南还是建议你在看完这篇文章之前千万别做微信营销 ...

  5. Go Gin框架请求自动验证和数据绑定,看完这篇就会用了

    之前做项目基本上公司是用 gRPC 和 echo 这两个框架的组合,后来 Gin 框架在Go圈越来越流行,陆续我在公司接触到的项目也开始有人用 Gin 框架开发了. 因为我也是偶尔开发,像Gin框架里 ...

  6. 【前沿科技】看完这篇文章前,你绝对想象不到欧美航空机器人竟然发展到这个程度了!...

    来源:中国机器人网 <工程>杂志撰文认为,工业机器人在许多行业中已经建立了良好的基础,并且通常与现代化的先进制造系统相关联,但是,航空制造仍然严重依赖熟练的手工作业.航空制造中采用机器人的 ...

  7. 如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章

    前言 当你准备去复习Spring中Bean的生命周期的时候,这个时候你开始上网找资料,很大概率会看到下面这张图: 先不论这张图上是否全面,但是就说这张图吧,你是不是背了又忘,忘了又背? 究其原因在于, ...

  8. 看完这篇文章,让你彻底理解事务隔离级别(读未提交、读已提交、可重复读、序列化)

    对于不同的事务,采用不同的隔离级别分别有不同的现象.主要有下面3种: 1.脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据. 2.不可重复读(nonrepeatable re ...

  9. 电动车质量排名前十名有哪些?看完这篇文章你就知道啦

    在一二线城市,很多有能力买私家车的人反而更倾向于买电动车,这是因为长途出行有公共交通工具,短途出行驾车容易遇到堵车难题,还不如电动车方便.而在三线及以下城市,电动车凭借操作简单.价格便宜等优点,也是大 ...

  10. 我在公司用Jmeter刚压一天就崩了,请求、响应数据都为空?就问你慌不慌

    文章前景,公司服务器需要压两天,在使用GUI模式下,本机Jmeter压了一天就蹦了,而且期间有错误请求,但是返回查看日志时,日志信息的请求.响应时间都显示为空. 注意: 第6点Jmeter5.0更改放 ...

最新文章

  1. jupyter读取图片并展示的两种方法
  2. JVM SandBox 的技术原理与应用分析
  3. relu不可微为什么可用于深度学习
  4. boost::partial_sort相关的测试程序
  5. 程序猿眼里的高并发架构
  6. [Elasticsearch] 邻近匹配 (二) - 多值字段,邻近程度与相关度
  7. navicat 官方使用手册,中文版,快捷键大全
  8. 微软ASP.NET AJAX框架剖析
  9. Win7下DB2 Express-C 9.7.2的卸载与安装(上)
  10. 回调函数原理与Python实现
  11. 自定义_Excel中的自定义函数(自定义函数的基础内容)
  12. Spatial Pyramid的BOW和Pyramid HOG的多核
  13. github 更纱黑体_【Freeplane相关】一招解决更纱黑体导出思维导图PDF的问题
  14. RTCP 协议的 NACK 报文
  15. 内外部函数和内存模型
  16. 电脑桌面录制直播嵌入网页
  17. JAVA实现FTP文件传输
  18. python读取xlsx文件pandas_pandas dataframe 读取 xlsx 文件
  19. Nginx 简易教程
  20. [Python3] 008 列表内涵,“满腹经纶”

热门文章

  1. Model to Text工具Acceleo使用教程(六)——模板服务
  2. Win7中如何删除访问共享时所保存的用户名和密码
  3. 款装机热门电源横向评测
  4. 将服务费用DIY到底----走出软件作坊:三五个人十来条枪 如何成为开发正规军(十)...
  5. 9. Git flow
  6. 57. web 攻击技术
  7. 1. Composer 简介
  8. Binwalk 后门(固件)分析利器
  9. SqlServer触发器常用语法AFTER、INSTEAD OF及其详解
  10. 领扣(LeetCode)七进制数 个人题解