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:自定义扩展值,如果服务器不支持则忽略
  • 总结
    • chrome浏览器对max-age>0、no-store、max-stale请求头部支持不好,完全按钮响应的max-age来控制缓存了,firefox是按照http规范实现的。
    • If-Unmodified-Since:不会响应412的情况
      • last-Modified值匹配成功
      • 服务器需要响应2XX或412之外的状态码
      • 请求发送过来的时间格式不对

二、浏览器离线缓存

实现离线缓存的步骤:

  1. 创建一个缓存文件,如:main.appcache,建议文件以.appcache结尾
  2. 在web服务器上添加mine-type标识头,如:text/cache-manifest
  3. html文件引入此内容,如下代码:
<html manifest="test.appcache" >
<head>
    <meta charset="UTF-8">
</head>
<body>

</body>
</html>
  1. main.appcache值说明
CACHE MANIFEST
# 首次下载后需要缓存的文件

# 禁止缓存的文件
network:

# 回退文件(页面无法访问时回退的页面)
fallback:
  1. 事件与状态

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");
})
  1. 注意事项
    6.1 CACHE MANIFEST必须在首行,且要大写
    6.2 缓存文件,浏览器直接清理缓存是无效的
    6.3 修改main.appcache文件任何内容,都会导致离线缓存重新加载,包含注释信
    6.4 引入main.appcache文件的html文件,会直接被离线缓存
    6.5 缓存对象:window.applictionCache
时间: 2024-12-21 02:25:19

http缓存与离线缓存的相关文章

HTML5离线缓存(Application Cache)

HTML5离线缓存又名Application Cache,是从浏览器的缓存中分出来的一块缓存区,要想在这个缓存中保存数据,可以使用一个描述文件(manifest file),列出要下载和缓存的资源. Manifest 文件 manifest 文件是简单的文本文件,它告知浏览器被缓存的内容(以及不缓存的内容). manifest 文件可分为三个部分: CACHE MANIFEST - 在此标题下列出的文件将在首次下载后进行缓存 NETWORK - 在此标题下列出的文件需要与服务器的连接,且不会被缓

HTML5离线缓存

参考文档:http://www.w3cschool.cc/html/html5-app-cache.html HTML5 应用程序缓存 又称离线缓存 ,即使断线了,刷新后也还是缓存了原来的页面,不会404了 首先,请在文档的<html> 标签中包含 manifest 属性: <!DOCTYPE HTML> <html manifest="page.appcache"> <!--这里的page.appcache是一个文件,自己手动生成-->

HTML5 离线缓存管理库

一.HTML5离线缓存技术 支持离线缓存是HTML5中的一个重点,离线缓存就是让用户即使在断网的情况下依然可以正常的运行应用.传统的本地存储数据的方式有 localstorage,sessionstorage和cookie.但是这些传统的方式有着致命的弊端.首先这些传统的存储方式的最大使用空间有 限,最多不超过5M;其次它们处理大规模的结构化数据的能力有限.鉴于传统方式的局限性,HTML5提出了三种新的离线缓存解决方案:Web SQL,indexedDB和File System. 其中Web S

HTML5 离线缓存详解(转)

离线缓存是html5新特性之一,简单理解就是第一次加载后将数据缓存,在没有清除缓存前提下,下一次没有网络也可以加载,用在静态数据的网页或游戏比较好用.当然,Html5新的特性都不是所有浏览器都能支持的,离线缓存也一样.反正IE9(包括)及IE9以下的浏览器目前是不支持的.如果用在移动端,应该都能支持.检测是否支持离线缓存也是比较简单的. if(window.applicationCache){ alert("支持离线缓存"); } else{ alert("不支持离线缓存&q

iOS离线缓存

为了节省流量和更好的用户体验,目前很多应用都使用本地缓存机制,不需要每次打开app的时候都加载数据,或者重新向服务器请求数据,因此可以把每次浏览的数据保存到沙盒中,当下次打开软件的时候,首先从沙盒加载缓存的数据,或者当app未联网的时候,从沙盒中加载之前缓存的旧数据. 离线数据的方法选择 plist文件 Document路径 数据库 由于保存的是大批量数据,且会不停的刷新新数据,因此应该选择数据库来存储.使用数据库可以快速地进行数据的读取操作. 1.设计思路 如下图,说明了离线缓存的流程: 离线

H5离线缓存机制-manifest

简介:Manifest 其实就是web应用的一种缓存机制,主要用于现在webapp应用中,它是浏览器自己的一种机制,随着移动互联网时代的到来,网络可靠性降低,如果我们已经将需要的文件缓存下下来,一旦网络无法访问,也能继续访问. 而且做好相应资源的缓存可以带来更好的用户体验,当用户使用自己的流量上网时,本地缓存不仅可以提高用户访问速度,而且大大节约用户的使用流量. 先来看下我们公司实际项目中的使用情况.(阿里淘点点也使用了manifest) 第一次加载时:整体请求是392KB耗时1.82s 当本地

Android之 -WebView实现离线缓存阅读

前言 本篇博客要实现的是一个离线下载和离线阅读的功能,这是很多阅读类app都常见的一个功能,典型的应用就是网易新闻.什么是离线下载?其实这个概念是比较模糊,是离线之后下载呢,还是下载之后离线,但稍微有点脑子的人都知道没有网络之后怎么下载呢?所以离线下载这个功能是”在有网络的情况下,把资源下载到本地“,离线阅读就是”在没有网络或者网络不好的时候,阅读本地好缓存的文章资源“.这样就很清楚我们要的这两个具体的功能需求了. 实现思路 小巫这里提供两个实现思路,一个就是自己写逻辑,一个是通过WebView

HTML5应用程序缓存实现离线Web网页或应用

HTML5应用程序缓存和浏览器缓存的区别.(有些)浏览器会主动保存自己的缓存文件以加快网站加载速度.但是要实现浏览器缓存必须要满足一个前提,那就是网络必须要保持连接.如果网络没有连接,即使浏览器启用了对一个站点的缓存,依然无法打开这个站点.只会收到一条错误信息.而使用离线web应用,我们可以主动告诉浏览器应该从网站服务器中获取或缓存哪些文件,并且在网络离线状态下依然能够访问这个网站. 如何实现HTML5应用程序缓存.实现HTML5应用程序缓存非常简单,只需三步,并且不需要任何API.只需要告诉浏

Win8.1应用开发之离线缓存

我们在开发应用商店应用时,需要app具有缓存的功能,这样在离线模式下,仍能工作.我们选择的project为Hub. 这里采取的策略是:在HubPage.xaml.cs(之所以不选择App.xaml.cs,是为了能让用户一边操作界面一边进行下载)中,利用await异步编程,避免阻塞UI,先读取存有图片路径的JSON,然后解析该JSON得到每一张图片的URI,再根据URI下载图片,对于文字资源,直接下载JSON.这里要特别注意文件操作--文件权限,同时更要注意文件流的选取--如果选择不当会导致在下载