http缓存与离线缓存
一、http协议实现缓存
1. 缓存头部
通用缓存、条件缓存、缓存控制三大类
| 头部名称 | 说明 | 请求/响应 |
| 通用缓存头部 | 控制客户端是否向服务器发送请求或者是服务端响应请求 | |
| cache-control | 用于随报文传递的缓存提示 | |
| pragma | http1.0的,等于cache-control:no-cache,pragma优先级高于expires | |
| 条件头部 | ||
| Last-Modified | 服务器响应时将文本最后修改时间放在此头部一起传送,如:Last-Modified:GMT | 响应 |
| If-Modified-Since | 客户端发送收到的last-Modified的时间,让服务器验证,资源没有修改则是304 | 请求 |
| If-Unmodified-Since | 若last-Modified没有匹配上,返回412(预验证失败) | |
| ETag | 服务器响应时将文本的md5值跟随此头发送到客户端 | 响应 |
| If-None-Match | 告诉服务器如果没有匹配上ETag相关资源就重发,否则304 | |
| If-Match | 如果服务器没有匹配上ETag相关资源,则响应412 |
其他缓存头部 Vary | 向服务器请求时以Vary指定的字段来区分内容是否缓存了 data/age | 服务器响应时输出资源的最后响应时间(从本地缓存读取的资源不会有变化,也就是cache-control控制),而304的吃响应是有变化的
2. Vary
Vary: User-Agent, Accept-Encoding
告知服务器以User-Agent、Accept-Encoding两个头部的值区分缓存版本
3. cache-control的值说明
cache-control与expires是一致的,但expires是http1.0的东西,现代浏览器用得很少。
请求头部
- max-age
- max-age=0:表示跳过强制缓存,进行协商缓存
- max-age= 10(>0):客户端在指定时间内不会向服务器请求获取新的数据。
- no-cache: 告知(代理)服务器不直接使用缓存,要求向服务器发起请求,始终请求会被执行
- no-store: 所有内部不会被缓存或者放在浏览器临时文件夹下面
- max-stale: 告知(代理)服务器 客户端愿意接收一个超过缓存时间的资源,如果设置了 值(单位:秒),max-stale:3,超过3秒的值,没有则是任意时间
- min-fresh=seconds:客户端想接受一个小于seconds秒内被更新过的资源,至少在未来seconds秒内文档保持新鲜。chrome还是以max-age为准,firefox当值小于max-age时,以min-fresh为准,当值大于max-age时,直接无效
- no-transform:传送没有被转换过的实体数据(如:压缩),不知如何验证
- only-if-cached:客户端获取缓存(若有),不用向服务器请求, 无缓存则原始请求
- cache-extension:自定义扩展值,如果服务器不支持则忽略
- 响应头部
- max-age
指定响应多少秒之后过期(相对时间) - no-cache:不能直接使用缓存,要求向服务器发起请求(检测新鲜程度),始终请求会被执行 no-cache覆盖max-age的设置
- no-store: 所有内部不会被缓存或者放在浏览器临时文件夹下面,始终请求会被执行 no-store覆盖max-age的设置
- public:允许任何地方缓存,代理、cdn都可以
- private[=fieldName]:客户端可以缓存private响应问,但通常只针对用户,所以cdn、代理不缓存(未能测试出应用场景)
- no-transform:传送没有被转换过的实体数据(如:压缩),不知如何验证
- only-if-cached:客户端获取缓存(若有),不用向服务器请求, 无缓存则原始请求
- must-revalidate:当前资源一定是向原服务器发出验证请求的,若请求失败返回504(而非代理服务器的缓存),也就是响应必须来源于原始服务器
- proxy-revalidate:与must-revalidate类似,但仅能用于共享缓存(代理服务器)
- s-maxage:与max-age一致,但只能用于共享缓存(如:代理)
- cache-extension:自定义扩展值,如果服务器不支持则忽略
- max-age
- 总结
- chrome浏览器对max-age>0、no-store、max-stale请求头部支持不好,完全按钮响应的max-age来控制缓存了,firefox是按照http规范实现的。
- If-Unmodified-Since:不会响应412的情况
- last-Modified值匹配成功
- 服务器需要响应2XX或412之外的状态码
- 请求发送过来的时间格式不对
二、浏览器离线缓存
实现离线缓存的步骤:
- 创建一个缓存文件,如:main.appcache,建议文件以.appcache结尾
- 在web服务器上添加mine-type标识头,如:text/cache-manifest
- html文件引入此内容,如下代码:
<html manifest="test.appcache" >
<head>
<meta charset="UTF-8">
</head>
<body> </body>
</html>
- main.appcache值说明
CACHE MANIFEST
# 首次下载后需要缓存的文件 # 禁止缓存的文件
network: # 回退文件(页面无法访问时回退的页面)
fallback:
- 事件与状态
5.1 状态
| 状态值 | 说明 |
| 0 | 未缓存 |
| 1 | 空闲(缓存为最新状态) |
| 2 | 检查中 |
| 3 | 下载中 |
| 4 | 更新就绪 |
| 5 | 缓存过期 |
5.2 事件
| 事件名 | 说明 |
| checking | 正在检查 |
| downloading | 正在下载 |
| updatereadey | 更新完成 |
| obsolete | 缓存过期 |
| cached | 空闲,缓存为最新状态 |
| error | 缓存报错时触发的事件 |
| noupdate | 检查更新结束,没有需要更新的文件 |
window.applicationCache.addEventListener("cached",function(){
console.log("cached");
});
window.applicationCache.addEventListener("noupdate",function(){
console.log("noupdate");
})
- 注意事项
6.1 CACHE MANIFEST必须在首行,且要大写
6.2 缓存文件,浏览器直接清理缓存是无效的
6.3 修改main.appcache文件任何内容,都会导致离线缓存重新加载,包含注释信
6.4 引入main.appcache文件的html文件,会直接被离线缓存
6.5 缓存对象:window.applictionCache
http缓存与离线缓存的更多相关文章
- HTML5离线缓存(Application Cache)
HTML5离线缓存又名Application Cache,是从浏览器的缓存中分出来的一块缓存区,要想在这个缓存中保存数据,可以使用一个描述文件(manifest file),列出要下载和缓存的资源. ...
- HTML5离线缓存
参考文档:http://www.w3cschool.cc/html/html5-app-cache.html HTML5 应用程序缓存 又称离线缓存 ,即使断线了,刷新后也还是缓存了原来的页面,不会4 ...
- H5 离线缓存的用法
H5离线缓存基础系列 1.什么是离线缓存 离线缓存:离线缓存可以将站点的一些文件缓存到本地,它是浏览器自己的一种机制,将需要的文件缓存下来,以便后期即使没有连接网络,被缓存的页面也可以展示. 2. ...
- H5离线缓存基础系列
1.什么是离线缓存 离线缓存:离线缓存可以将站点的一些文件缓存到本地,它是浏览器自己的一种机制,将需要的文件缓存下来,以便后期即使没有连接网络,被缓存的页面也可以展示. 2.离线缓存的优势 在没有网络 ...
- HTML5 离线缓存管理库
一.HTML5离线缓存技术 支持离线缓存是HTML5中的一个重点,离线缓存就是让用户即使在断网的情况下依然可以正常的运行应用.传统的本地存储数据的方式有 localstorage,sessionsto ...
- HTML5离线缓存问题
HTML5离线缓存问题 1.应用程序缓存 什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. ...
- Html5离线缓存详细讲解
离线缓存是Html5新特性之一,简单理解就是第一次加载后将数据缓存,在没有清除缓存前提下,下一次没有网络也可以加载,用在静态数据的网页或游戏比较好用.当然,Html5新的特性都不是所有浏览器都能支持的 ...
- 使用html5的离线缓存技术
突然想用html5的离线缓存,但是一直没有成功,在各种群里问发现很多人都没什么经验,最终终于在各种论坛找到解决方案了.下面就简单记录一下相关情况. 一.离线缓存的优点 我们都知道离线缓存主要是用来减少 ...
- 使用 jQuery Mobile 与 HTML5 开发 Web App —— HTML5 离线缓存
本文要介绍的,是 HTML5 离线网络应用程序的特性,离线网络应用程序在 W3C 中的实际名称是 "Offline Web applications" ,也称离线缓存.当用户打开浏 ...
随机推荐
- 【HTTP】---HTTP状态码详解
https://en.wikipedia.org/wiki/List_of_HTTP_status_codes 1.百科名片 HTTP状态码(HTTP Status Code)是用以表示网页服务器HT ...
- Spark 常规性能调优
1. 常规性能调优 一:最优资源配置 Spark性能调优的第一步,就是为任务分配更多的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的性 ...
- Ubuntu 服务器设置软件多用户访问
假设在用户A下安装了软件xx 路径写入$home/.bashrc 这时该软件只有该用户可以使用 若要其他用户也能使用,只需要将该.bashrc拷贝到其他user的$home目录就行了
- 【C语言编程练习】5.7填数字游戏求解
之前的东西就不上传了,大致就跟现在的一样 1. 题目要求 计算 ABCD * E DCBA 这个算式中每个字母代表什么数字? 2. 题目分析 如果是我们人去做这道题会怎么办,一定是这样想把,一个四位 ...
- FTP连接虚拟主机响应220 Welcome to www.net.cn FTP service. (解决的一个问题)
问题场景: 使用FTP客户端连接虚拟主机时,同样的账号密码在有的网络下可以连接成功,有的网络下却一直连接不上:ftp响应“220 Welcome to www.net.cn FTP service.” ...
- 用python写一个非常简单的QQ轰炸机
闲的没事,就想写一个QQ轰炸机,按照我最初的想法,这程序要根据我输入的QQ号进行轰炸,网上搜了一下,发现网上的案列略复杂,就想着自己写一个算了.. 思路:所谓轰炸机,就是给某个人发很多信息,一直刷屏, ...
- Rectangular Covering [POJ2836] [状压DP]
题意 平面上有 n (2 ≤ n ≤ 15) 个点,现用平行于坐标轴的矩形去覆盖所有点,每个矩形至少盖两个点,矩形面积不可为0,求这些矩形的最小面积. Input The input consists ...
- go、java or c艹 引用的本质
在底层,引用变量由指针按照指针常量的方式实现 即一个指针常量,和一些解引用等的封装: 合到一起实现了指针这么一种形式. 用指针和引用编译到了汇编层面应该是一样的.
- 安装使用eclipse
安装使用eclipse 目标 java学习需要,老师说要安装eclipse,,其实已经下了IDEA了,不过还是听老师的比较好( 准备 jre 也就是java运行环境,因为之前就下了jdk(里面包含jr ...
- 使用gulp打包普通项目
前言: 在使用gulp打包工具之前,我做的H5项目在浏览器中的缓存是很严重的,若改了一点css,加了一句js代码,不手动清除浏览器缓存是看不到效果的.老总也在项目演示当中遇到这些问题,一查找原因却是缓 ...