Cache-Control浏览器缓存
描述
同一个标签页,打开 A 站点,访问 config 接口,正常;打开 B 站点,访问 config 接口,正常;通过浏览器后退返回 A 站点,访问 config 接口,数据异常,config 返回了 B 站点的数据。
测试站点数据
https://a.aaa.com
https://b.bbb.com
分析
判断是否是前端问题
通过观察,后退时仍然向服务器发送了请求,调用了 config 接口,可以排除
判断是不是前端本地存储未更新
通过观察,config 接口返回的内容仍然是 B 站点的数据,排除本地存储未更新
结论:后端返回数据未更新
(好了,锅甩出去了)
but,站点已经改变了,接口也重新请求了,为什么后端返回数据未更新
结论:浏览器缓存问题
原理:符合缓存策略时,服务器不会发送新的资源,但不是说客户端和服务器就没有会话了,客户端还是会发请求到服务器的,响应的是缓存的内容。
如何解决
后端:在响应头中添加 cache-control: no-store
前端:在 ajax 请求 url 后面加上一个随机数
原理:ajax 填入相同的 url 的时候会使用缓存
常用的修改随机数的方法
url=xxxxxxxx?time=new Date(); // 加时间戳
url=xxxxxxxx?number=Math.random(); // 加随机数
对比解决方案
为什么不能设置请求头 Cache-Control: no-cache?
catch-control 是客户端单向的指令,服务器端可能没有同样的指令
为什么不能设置 meta 标签?
<html><meta http-equiv="pragma" content="no-cache" /><meta http-equiv="Cache-Control" content="no-store, must-revalidate" /><meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT" /><meta http-equiv="expires" content="0" />
</html>
meta 标签的解析实现不是所有浏览器的必然支持的,你给了某个标签,也只是建议浏览器应该怎么做而已,具体的浏览器对页面缓存的设置可能会让表现有异常
memory cache 内存缓存就是这样的,从这里获取内容时,就是会忽略些头部配置,比如 no-cache 或者 max-age=0 之类的。
如果想确保一定是新的,就要在服务端响应头中设置 cache-control:no-store
终于解决了 bug,现在可以来看一看 Cache-Control 是一个什么东西了。
Cache-Control
用于 HTTP 请求和响应中的,通过指定指令实现缓存机制。缓存指令是单向的,意味着在请求中设置的指令,不一定被包含在响应中。
指令(参数)
public
响应可以被任何对象(客户端、代理服务器等)缓存
no-cache
强制要求缓存把请求提交给原始服务器进行验证(协商缓存验证)
no-store
不使用任何缓存
max-age
缓存最大周期
must-revalidate
一旦资源过期,在成功向原始服务器验证之前,不能缓存响应后的任何数据
缓存控制
控制是否开启缓存
字段:Pragma 和 Cache-Control
Pragma:no-cache 禁用缓存 (HTTP/1.0)
Cache-Control:缓存控制 (HTTP/1.1)
注意:符合缓存策略时,服务器不会发送新的资源,但不是说客户端和服务器就没有会话了,客户端还是会发请求到服务器的。
优先级从高到低是 Pragma -> Cache-Control -> Expires
缓存校验
校验缓存是否过期
字段:Expires 和 Last-Modified 和 etag
Expires:缓存有效时间 (HTTP/1.0)
Last-Modified:资源最后修改时间 (HTTP/1.1)
etag:用于处理修改时间变了,但是内容没变的 bug (HTTP/1.1)
Cache-Control浏览器缓存相关推荐
- 缓存系列之一:buffer、cache与浏览器缓存
缓存系列之一:buffer.cache与浏览器缓存 一:缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较快的一方起到一个加速访问速度较慢的一方的作用,比如CPU的一级.二级缓存是保 ...
- 每次都要清理cache?强制不让浏览器缓存!
调试网页flash程序,总需要强力缓存是不是很恶心. 看看这篇文章: 做过网页方面工作的朋友一定知道浏览器缓存(cache)这个机制,但是在开发中是一个比较烦人功能,每次修改了代码,想刷新看结果,这时 ...
- Chrome 技术篇-F12开发者工具清理缓存,高级、专业清浏览器缓存,storage和cache都指什么、区别
作为一名开发,作为一名技术人员,直接用浏览器清缓存的话会显的不够专业. 开发者工具清理的好处: 它可以很清晰的清理对应的缓存,让我们知道哪些缓存对我们的哪些代码有影响,提高我们对整体代码的把控,提升我 ...
- chrome浏览器缓存 from disk cache
今天遇到个问题,同样的两个前端项目,服务器也一样,但是有一个项目的接口出现status:200 (from disk cache),之前从没遇见过,在此记录一下.解决办法:只要清除浏览器缓存(更多工具 ...
- 浏览器缓存:memory cache、disk cache、强缓存协商缓存等概念
文章目录 分类 memory cache disk cache Service Worker Push Cache 缓存过程 强缓存 1.Expires 2.Cache-Control Expires ...
- 浏览器缓存(一):强缓存 MEMORY CACHE 和 DISK CACHE
关于memory cache 和 disk cache 随便浏览一个网站: 首次打开,或者开启浏览器的 Disable Cache(浏览器的Network下, 与Preserve log同级别),在s ...
- js html 图片 缓存问题,如何防止浏览器缓存CACHE?将CSS、JS、图片加上参数
什么是浏览器缓存 浏览器缓存功能是网页性能优化的项目之一 使用浏览器缓存功能如果用户再次来到您的网站,缓存css.js.jpg.png图档等静态资源将能使网页打开速度加快,同时也能减少服务器负担. 更 ...
- 浏览器缓存Cache
首先缓存的优点是:缓解服务端压力:快. 强缓存和协商缓存 强缓存是从本地缓存数据表中去取资源,不向服务端发送请求:协商缓存意思是每次使用缓存前都要和服务端进行确认. 从Response Header的 ...
- cache-control_网站 cache control 最佳实践
有时,当第二次访问网站时,看起来比较怪,样式不正常. 通常,是因为 cache control 缓存控制策略定义不正确,导致服务端最新部署之后客户端没有接收到最新的更改. 本文将向您展示正确的缓存设置 ...
- 利用浏览器缓存抓取网络资源:【炉石传说】所有卡牌png图片地址
有的时候我们在网络上看到很好的资源,想要抓取,却苦于没有好的手段.今天我就来介绍一下通过chrome浏览器缓存抓取的方法. 大家都知道,浏览器把网页展示给我们看的时候,会先将页面上的所有图片等资源下载 ...
最新文章
- 中文详解phpmailer所有对象和属性
- 数据结构笔记 递推与迭代
- day22 time模块
- 《深入理解Elasticsearch(原书第2版)》一1.3 在线书店示例
- systemverilog硬件设计及建模_Chisel引领敏捷硬件开发浪潮
- Java查询图书信息
- transporter上传卡正在交付_Xcode11,Transporter上传卡在——正在验证 APP - 正在通过App Store进行认证...
- python的标志为什么是蛇_Python 为什么推荐蛇形命名法原因浅析
- C#参考 : 枚举类型
- Linux 进入 5.0 时代!
- R文件报错:cannot resolve symbol ‘R’
- python3 十六进制字符串进行分割并累加
- window.location.href不打开新窗口_在使用网站时,什么情况该用新窗口打开?
- 微型计算机的Usb有几个,一起来侃侃USB/eSATA二合一接口
- 服务器装win7找不到硬盘驱动,电脑找不到硬盘驱动器,教你win7电脑找不到硬盘驱动器的解决方法...
- ISA TEST黑客过关小游戏第二关解密
- 智能快递柜 软件架构 linux,13.智能快递柜(对接流程)
- 计算机科学班会,计算机科学与技术学院20级13班召开“砥砺前行,“计”往开来”主题班会...
- ioi 赛制_钟子谦IOI2019参赛总结
- msm8916 lcd 相关调试点指导