f5到底刷新了点什么,你知道吗
引言
前面翻到了http缓存相关内容,关于强制缓存和协商缓存,他们之间的差别可能大家比较清楚。
并且常规情况下是否该使用缓存以及使用哪种缓存,
相关文章多且全,这里不再赘述。
不过用户的不同行为会打破原有规范,
本文就会去探究下不同行为下的浏览器缓存表现。也就是f5到底刷新了哪些内容
浏览器缓存
说道浏览器缓存,脑海中常见的应该是那么几种关键词:
Cache-Control、Expires、ETag、If-Match、If-None-Match、Last-Modified等。
根据不同标识的作用,再次访问某个资源时,
需要缓存的情况下,主要有下面两种缓存方式
强缓存
一旦资源命中强缓存, 浏览器便不会向服务器发送请求, 而是直接读取缓存.
Chrome下的现象是 200 OK (from disk cache) 或者 200 OK (from memory cache).
协商缓存
也就是我们常见的304状态码。
缓存过期后, 继续请求该资源,
对于现代浏览器, 存在如下两种做法:
- 根据上次响应中的ETag_value, 自动往request header中添加If-None-Match字段.
服务器收到请求后, 拿If-None-Match字段的值与资源的ETag值进行比较,
若相同, 则命中协商缓存, 返回304响应. - 根据上次响应中的Last-Modified_value, 自动往request header中添加If-Modified-Since字段. 服务器收到请求后, 拿If-Modified-Since字段的值与资源的Last-Modified值进行比较, 若相同, 则命中协商缓存, 返回304响应.
ETag是http/1.1新增标识,也是为了解决Last-Modified存在的一些问题。
例如服务器和客户端时间不同步等问题,
所以比Last-Modified的优先级高。
因此常见情况下,资源的缓存就是按照上面的顺序,强缓存=>协商缓存=>重新获取。
但是,缓存策略是与用户的操作相关的,平时不可避免会用到刷新。
刷新的方式是多种多样的。刷新按钮,command+r,shift+command+r等。他们之间的区别是什么呢。以http://xxdy.tech/作为例子来看一下。
再次访问(地址栏回车)
可以看到资源分下面几类:
先看下直观的请求
大部分都是200强缓存,只有文稿是304
- 无缓存的,maxage=0的资源
此类资源,请求的时候总会从服务端重新加载
- status为200,但是后面有提示from memory cache 或者disk cache的标识。 这种缓存的字体为灰色,跟上面的200还是比较容易看出来差别的。
css资源的响应,来自硬盘缓存。
js的响应,即来自memory的缓存
这里就是强缓存,直接从本地缓存中读取。
因为Cache-Control:max-age=600 刷新时未过期,所以会从本地缓存中获取。
这里截两张图的原因在于两者缓存存放的位置是不同。
概述一下(详细请找资料细究)
内存缓存(from memory cache):内存缓存具有两个特点,分别是快速读取和时效性
快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次运行使用时的快速读取
时效性:一旦该进程关闭,则该进程的内存则会清空。硬盘缓存(from disk cache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。
在浏览器中,大部分情况下浏览器会在js和图片等文件解析执行后直接存入内存缓存中,
那么当刷新页面时只需直接从内存缓存中读取(from memory cache);
而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(from disk cache)
- 协商缓存
status为304,意为与服务端对比之后文件未改变,返回原有缓存资源。
此资源请求头里面有Cache-Control: max-age=0 ,
所以每次请求都回去服务端询问,不会走强缓存,因为服务端也未更新,etag相同,所以返回缓存资源。
总结
地址栏回车的话,就是我们正常访问,遵循浏览器的缓存策略。
f5刷新(mac 即command + r)
f5刷新的时候,会有什么不同吗,先直观对比下。
好像没什么不同,具体到文件也是与直接回车相同的状态。
总结
那么f5的刷新到底是什么呢,
可以看到f5可以被称为soft refresh 其只是reload page而已。
即与回车地址相同,正常规则下的缓存还是会涉及到。
强制刷新(command+shift+r)
此时可以看下请求结果,前面列出的304和from cache的项目都是重新load。
具体查看相应请求可以看到,
在request中多了个属性:
都有Cache-Control: no-cache的标识。
这表明每次都需要服务器评估是否有效,不要理解为直接不使用缓存。
此外可以注意到request中没有可以匹配response中ETag的If-None-Match属性,
所以会重新加载。
总结而言
此时的刷新可以称为hard refresh,
请求会加上一个Cache-Control:no-cache的标识来表明突破cache-control的限制,
需要服务端重新判断有效性,即不走强缓存。
另外请求header中去掉If-None-Match,这样就不能使用协商缓存。拉到新的资源
tip
这里硬性重新加载,有些文件是依旧使用缓存的,我这边看到是有些小的image,没有找到合理的解释。具体我需要在研究一下,后面补上
停用缓存并刷新
针对上面提到的哪些文件,此时就需要到下面这种清空缓存并硬性重新加载了。
操作完之后就完全不使用缓存了。
规则
上面提到那么几种刷新方式对应的效果,可能不同浏览器的实现也不同。找了个相对完善的大家可以参考一下。
结束语
到这里,关于刷新与缓存的个人一些关掉就结束了,抛砖引玉,希望能对有需要的人有所帮助,也希望有大神有所指教。更多个人博客请移步
此外感谢下面的参考文章:
https://stackoverflow.com/questions/8589760/difference-between-f5-ctrl-f5-and-click-or-refresh-button
https://stackoverflow.com/questions/385367/what-requests-do-browsers-f5-and-ctrl-f5-refreshes-generate
f5到底刷新了点什么,你知道吗的更多相关文章
- js禁止页面刷新禁止用F5键刷新,禁止右键
<script language="javascript"> //禁止用F5键 function document.onkeydown() { if ...
- 怎么屏蔽F5键刷新功能
window.document.onkeydown=function(){if(event.keyCode==116){//屏蔽F5键,改为只刷新本页面,防止一刷就刷整个窗口event.keyCode ...
- F5当刷新页面,出现“要再次显示此页,web该浏览器,你曾经有过发送消息再次提交...点击重试",如何防止此对话框解决方案的出现,
如何取消刷新页面弹出"重试"对话? 找了好多类似的问题都没有我想要的答案,请大家看清楚再回答. 比方说,登录过程中,成功之后转向还有一个页面success.jsp, 这时,假设刷新 ...
- js实现F5键刷新后菜单保持之前状态以及监听F5页面刷新子iframe 而父页面不刷新
利用layui实现菜单效果时,刷新页面仍回到首页状态,需要 实现iframe子页面刷新父元素不刷新,下面是代码 //刷新时禁用F5的默认事件 $(document).keydown(function ...
- js 能实现监听F5页面刷新子iframe 而父页面不刷新
重点是阻止默认的刷新,这样外部页面就不刷新了,然后指定刷新iframe,我下面给出了思路 document.onkeypress = function(e){ if(e.keyCode == 116) ...
- 多数浏览器默认会缓存input的值,只有使用ctl+F5强制刷新的才可以清除缓存记录。
如果不想让浏览器缓存input的值,有2种方法: 方法一: 在不想使用缓存的input中添加 autocomplete="off"; eg: <input type=&quo ...
- 电脑的f5刷新不了
新买的电脑,f5刷新不了页面,网上查了后发现是fn功能键的原因.同时fn+f5即可刷新.可是依然感觉好别扭... 按下fn+esc,再只按f5,就可以刷新页面了.神奇...
- ctrl+shift+r / ctrl+f5 强制(不使用缓存)刷新google chrome网页
我改了csdn图片后, 一直看到的是旧图片, n天之后, 还是旧图片.猜测应该是用了缓存(且缓存更新逻辑失败, 定是csdn的bug), 用ctrl+shift+r, 或者ctrl+f5, 强制刷新页 ...
- iframe结构的网站按F5刷新子页面的实现方式
有的网站或者后台系统由于页面有公共的部分,比如菜单,会把公共的部分放在一个页面,这里称之为父页面,而把具体的内容放入一个iframe中,之后的请求改变iframe的内容.但是这样会有一个问题,因为浏览 ...
随机推荐
- Confluence 6 编辑站点欢迎消息使用模板编辑器的小提示
站点欢迎消息是一个模板而不是一个页面,所以你需要使用模板编辑器来对你的消息进行编辑. 你可以和在你 Confluence 中其他页面中一样,在站点欢迎消息模板中添加文本,连接和宏.但是添加图片的话会有 ...
- python之内置模块random(转载)
转载自http://www.cnblogs.com/wcwnina/p/9281334.html random.seed(a=None, version=2) # 初始化伪随机数生成器,若种子a相同, ...
- 三.NFS存储服务
01. 课程回顾 备份服务概念介绍(rsync备份服务利用相应算法,实现增量数据同步) 备份服务工作方式说明: 1. 本地数据备份同步方式(类似cp命令) 2. 远程数据备份同步方式(类似scp命令) ...
- hdu4276 依赖背包
网上题解都是用spfa求1-n路径的,但其实dfs一次就可以了.. #include <iostream> #include <cstdio> #include <str ...
- 开始接触python
1.什么是语言? 语言是一个事物与另一个事物交流的介质 python是人与计算机交流的介质 能够被计算机所识别的表达方式即是编程语言 2.什么是编程? 编程就是程序员将想让计算机做的事情用编程语言表达 ...
- Jmeter-JDBC Request参数化
一.参数化 1.选择Query Type(查询类型)为Prepared Select Statement 2.写好sql 3.在Parameter Values中输入参数,多个参数用‘,’隔开 4.P ...
- python 之 列表与字典
1.4 列表与字典 列表与字典,这两种类型,都是各种类型的集合,以列表为例,如果列表中包含列表,就形成嵌套. 这两种类型几乎是所有python脚本的主要工作组件 . 这种结构信息是可变的可修改的.不像 ...
- EntityFramework Reverse POCO Code First 反向生成器
https://marketplace.visualstudio.com/items?itemName=SimonHughes.EntityFrameworkReversePOCOGenerator ...
- photoshop CC智能切图
网页设计在技术层面上,第一步是美工做出网页效果图,第二步就是网页前端进行网页切图.网页切图工具常用的有fireworks.PS,这里使用PS进行网页切图. 我们通过设计稿,得到我们想要的产出物(如.p ...
- JSP中out.print()、out.println()以及out.write()的区别
out是JSP九大内置对象之一,是JspWriter的一个对象,JspWriter继承了java.io.Writer类. out.print()和out.write() print()和println ...