引言

前面翻到了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

  1. 无缓存的,maxage=0的资源

此类资源,请求的时候总会从服务端重新加载

  1. 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)

  1. 协商缓存

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到底刷新了点什么,你知道吗的更多相关文章

  1. js禁止页面刷新禁止用F5键刷新,禁止右键

    <script     language="javascript"> //禁止用F5键 function     document.onkeydown() { if   ...

  2. 怎么屏蔽F5键刷新功能

    window.document.onkeydown=function(){if(event.keyCode==116){//屏蔽F5键,改为只刷新本页面,防止一刷就刷整个窗口event.keyCode ...

  3. F5当刷新页面,出现“要再次显示此页,web该浏览器,你曾经有过发送消息再次提交...点击重试&quot;,如何防止此对话框解决方案的出现,

    如何取消刷新页面弹出"重试"对话? 找了好多类似的问题都没有我想要的答案,请大家看清楚再回答. 比方说,登录过程中,成功之后转向还有一个页面success.jsp, 这时,假设刷新 ...

  4. js实现F5键刷新后菜单保持之前状态以及监听F5页面刷新子iframe 而父页面不刷新

    利用layui实现菜单效果时,刷新页面仍回到首页状态,需要 实现iframe子页面刷新父元素不刷新,下面是代码 //刷新时禁用F5的默认事件 $(document).keydown(function ...

  5. js 能实现监听F5页面刷新子iframe 而父页面不刷新

    重点是阻止默认的刷新,这样外部页面就不刷新了,然后指定刷新iframe,我下面给出了思路 document.onkeypress = function(e){ if(e.keyCode == 116) ...

  6. 多数浏览器默认会缓存input的值,只有使用ctl+F5强制刷新的才可以清除缓存记录。

    如果不想让浏览器缓存input的值,有2种方法: 方法一: 在不想使用缓存的input中添加 autocomplete="off"; eg: <input type=&quo ...

  7. 电脑的f5刷新不了

    新买的电脑,f5刷新不了页面,网上查了后发现是fn功能键的原因.同时fn+f5即可刷新.可是依然感觉好别扭... 按下fn+esc,再只按f5,就可以刷新页面了.神奇...

  8. ctrl+shift+r / ctrl+f5 强制(不使用缓存)刷新google chrome网页

    我改了csdn图片后, 一直看到的是旧图片, n天之后, 还是旧图片.猜测应该是用了缓存(且缓存更新逻辑失败, 定是csdn的bug), 用ctrl+shift+r, 或者ctrl+f5, 强制刷新页 ...

  9. iframe结构的网站按F5刷新子页面的实现方式

    有的网站或者后台系统由于页面有公共的部分,比如菜单,会把公共的部分放在一个页面,这里称之为父页面,而把具体的内容放入一个iframe中,之后的请求改变iframe的内容.但是这样会有一个问题,因为浏览 ...

随机推荐

  1. selenium+python之 辨识alert、window以及操作

    1.分辨 首先区别下alert.window和伪装对话框: alert,浏览器弹出框,一般是用来确认某些操作.输入简单的text或用户名.密码等,根据浏览器的不同,弹出框的样式也不一样,不过都是很简单 ...

  2. android组件之TabHost

    一 介绍 1.1 TAB的容器.这个对象包含两个子元素: TabWidget:管理标签(tabs),用户点击来选择一个特定的标签,是它告诉TabHost去切换界面的 FrameLayout:对象显示该 ...

  3. 量化投资与Python

    目录: 一.量化投资第三方相关模块 NumPy:数组批量计算 Pandas:表计算与数据分析 Matplotlib:图表绘制 二.IPython的介绍 IPython:和Python一样 三.如何使用 ...

  4. LeetCode(66): 加一

    Easy! 题目描述: 给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会 ...

  5. 【python】python版本升级2.6.6到2.7.3(CentOS release 6.2)

    一. 升级python到2.7.3 wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz tar -zxvf Python-2.7. ...

  6. php 重要函数归集

    1.json_encode 与 json_decode json_encode 把数组转化成字符串 json_encode(array) json_decode 把目标字符串转成数组json_deco ...

  7. C++设计模式——单例模式(转)

    问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能:在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进 ...

  8. Parameter 'name' not found. Available parameters are [arg1, arg0, param1, param2]

    解决方法: <select id="selectIf" resultType="student"> SELECT id,name,age,score ...

  9. K3 WISE 开发插件《SQL语句WHERE查询-范围查询/模糊查询》

    0.存储过程开头变量定义 @FBeginDate varchar(10), --单据起始日期 @FEndDate varchar(10), --单据截止日期. @FItemID varchar(50) ...

  10. 洛谷---小L和小K的NOIP考后放松赛

    链接: https://www.luogu.org/contestnew/show/11805?tdsourcetag=s_pcqq_aiomsg 题解: 没人过的题我就没看 t2: 考虑每个点是朋友 ...