HTML5的离线存储使用一个manifest文件来标明哪些文件是需要被存储的,使用如

来引入一个manifest文件,这个文件的路径可以是相对的,也可以是绝对的,如果你的web应用很多,而且希望能集中管理manifest文件,那么静态文件服务器是个不错的选择。

对于manifest文件,要求:文件的mime-type必须是 text/cache-manifest类型。如果你是JAVA工程,在你的web.xml中配置请求后缀为manifest的格式:

[html] manifest text/cache-manifest 这样可以控制请求到的manifest文件格式为text/cache-manifest的。

manifest文件的格式:

[html] CACHE MANIFEST # 这一句必须存在,而且必须放在头部 # 指明缓存入口 CACHE: index.html style.css images/logo.png scripts/main.js # 以下资源必须在线访问 NETWORK: login.php # 如果index.php无法访问则用404.html代替 FALLBACK: /index.php /404.html
其中 CACHE 不是必须存在的,可以直接在 CACHE MANIFEST 行之下直接写需要缓存的文件,在这里指明的文件将被缓存到浏览器本地。在NETWORK之下指明的文件,是强制必须通过网络资源获取的,在FALLBACK下指明的是一种失败的回调方案,比如上述index.php无法访问,那么就发出404.htm请求

这样几步就可以完成对离线存储的支持。接下来要思考的,是如何更新离线存储?

当用户本地再次联网的时候,本地的离线存储资源需要检查是否需要更新,这个更新过程,也是通过manifest的更新来控制的,更新了manifest文件,浏览器会自动的重新下载新的manifest文件并在下一次刷新页面的时候进行资源文件的重新请求(第三次刷新替换本地缓存为最新缓存),而且这个请求是全局性的,也就是所有在manifest缓存列表中的文件都会被请求一次,而不是单独请求某个特定修改过的资源文件,因为manifest是不知道哪个文件被修改过了的。

对于全局更新的担心是不必要的,因为对于没有更新过的资源文件,请求依旧是304响应,只有真正更新过的资源文件才是200.

关于304响应:

如果客户端发送的是一个条件验证(Conditional Validation)请求,则web服务器可能会返回HTTP/304响应,这就表明了客户端中所请求资源的缓存仍然是有效的,也就是说该资源从上次缓存到现在并没有被修改过.条件请求可以在确保客户端的资源是最新的同时避免因每次都请求完整资源给服务器带来的性能问题.

服务器会读取到这两个请求头中的值,判断出客户端缓存的资源是否是最新的,如果是的话,服务器就会返回HTTP/304 Not Modified响应,但没有响应体.客户端收到304响应后,就会从缓存中读取对应的资源.

当客户端缓存了目标资源但不确定该缓存资源是否是最新版本的时候,就会发送一个条件请求.在Fiddler中,你可以在Headers Inspector查找相关请求头,这样就可以辨别出一个请求是否是条件请求.

在进行条件请求时,客户端会提供给服务器一个If-Modified-Since请求头,其值为服务器上次返回的Last-Modified响应头中的日期值,还会提供一个If-None-Match请求头,值为服务器上次返回的ETag响应头的值:

另一种情况是,如果服务器认为客户端缓存的资源已经过期了,那么服务器就会返回HTTP/200 OK响应,响应体就是该资源当前最新的内容.客户端收到200响应后,就会用新的响应体覆盖掉旧的缓存资源.

只有在客户端缓存了对应资源且该资源的响应头中包含了Last-Modified或ETag的情况下,才可能发送条件请求.如果这两个头都不存在,则必须无条件(unconditionally)请求该资源,服务器也就必须返回完整的资源数据.

所以控制离线存储的更新,需要2个步骤,一是更新资源文件,二是更新manifest文件,特别的,更新manifest文件是不需要修改什么特定内容的,只要是这个文件随意一处被修改,那么浏览器就会感知,对于我们的资源文件通常名称是固定的,比如xxx.css,更新内容不会带有文件名更新的情况下,需要更新manifest文件怎么操作呢?一个比较好的方式是更新任意一处# 开头的注释即可,其目的只是告诉浏览器这个manifest文件被更新过。

以上的这些内容,其更新操作都是浏览器自动完成的。同样的,W3C定义了离线存储的API规范:http://www.whatwg.org/specs/web-apps/current-work/#applicationcache

另外离线缓存需要注意以下几点:

1、可以通过iframe嵌入多个manifest文件。主页不需要配置manifest,这样index.html就不会被缓存。
<iframe frameborder="no" id="iframe1" scrolling="no" src="http://pic1.codesec.net/app_attach/20141022/20141022_32_50752_0.html"><br></iframe>
<iframe frameborder="no" id="iframe2" scrolling="no" src="http://pic1.codesec.net/app_attach/20141022/20141022_32_50752_1.html"><br></iframe>
<iframe frameborder="no" id="iframe2" scrolling="no" src="http://pic1.codesec.net/app_attach/20141022/20141022_32_50752_2.html"><br></iframe>
2、多个manifest文件还是会有空间的限制,在ipad的safari上不能超过50M。若cache1.manfest是26M,cache1.manfest是27M,则2个加起来超过50m,这时,首先cached完cache1,当缓存cache2的时候,会报一个超过缓存容量限制的错误。cache3自然也不会保存了。只保存了第一个cache1.
3、必须reload页面才会使缓存更新生效。
4、手动检查cache的更新。applicationCache.update();
5、手动执行更新。
applicationCache.addEventListener(updateready, function() {
if (confirm(本地缓存已被更新,是否刷新?)) {
// (3) 手工更新本地缓存
applicationCache.swapCache();
// 重载画面
location.reload();
}
}, true);
applicationCache.swapCache();必须放在updateready中执行。

转载于:https://www.cnblogs.com/2881064178dinfeng/p/7162125.html

html5的离线存储问题集合相关推荐

  1. html5离线储存不足,html5的离线存储问题

    HTML5的一个重要特性就是离线存储,所谓的离线存储就是将一些资源文件保存在本地,这样后续的页面重新加载将使用本地资源文件,在离线情况下可以继续访问web应用,同时通过一定的手法(更新相关文件或者使用 ...

  2. html5离线存储图片,HTML5教程 离线存储技术详解

    本篇教程探讨了HTML5教程 离线存储技术详解,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < 随着Web App的发展,越来越多的移动端App使用HTML5 ...

  3. HTML5:离线存储

    我们来看看HTML5的新特性---离线存储吧. 随着Web App的发展,越来越多的移动端App使用HTML5的方式来开发,除了一些HybridApp以外,其他一部分Web App还是通过浏览器来访问 ...

  4. 2020/12/28-每日三题第4弹:cookie-曲奇饼干?,HTML5的离线存储你真的懂了吗???

    前言: 我仔细想了想,今天好像没有啥说的(靓仔语塞),嗯~~~其实这都是我特意安排的,故意跟前面的风格不一样(绝对不是因为我辞藻匮乏了)

  5. HTML5 离线存储之Web SQL

    HTML5 在离线存储之Web SQL 本篇没有考虑异步,多线程及SQL注入 WebDatabase 规范中说这份规范不再维护了,原因是同质化(几乎实现者都选择了Sqlite), 且不说这些,单看在H ...

  6. 神奇的HTML5离线存储(应用程序缓存)

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接前端小尚,谢谢! 前言 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. HTML5引入 ...

  7. html5 application cache 空间限制,HTML5离线存储之Application Cache

    关于html5的离线存储,大致可分为: localStorage, sessionStorage indexedDB web sql application cache 可以在chrome的debug ...

  8. [html] 简述下html5的离线储存原理,同时说明如何使用?

    [html] 简述下html5的离线储存原理,同时说明如何使用? 原理:HTML5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储技术),通过这个文件上的解析清单离线存储资源,这些 ...

  9. HTML5的离线储存

    在用户没有与因特网连接时,可以正常访问站点或应用,在用户与因特网连接时,更新用户机器上的缓存文件.         原理:HTML5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储 ...

最新文章

  1. Spring Filter过滤器,Spring拦截未登录用户权限限制
  2. rsync+innotify实现实时同步
  3. 魂力真的存在那么该如何提高魂力呢
  4. RHEL 6.x 搭建企业级FTP
  5. vue 报错error: ‘to‘ is defined but never used (no-unused-vars)
  6. 题目2 : 回文字符序列(区间DP)
  7. IntelliJ IDEA 中文官方文档
  8. PHP生成海报 文字描边,php实现图片添加描边字和马赛克的方法
  9. 自动驾驶算法-滤波器系列(七)——ESKF(error-state Kalman Filter)介绍
  10. 解决办法:对uncompress未定义的引用
  11. 【三维路径规划】基于matlab粒子群算法无人机三维路径规划【含Matlab源码 1260期】
  12. Synonyms,一个开源的中文近义词工具包
  13. 认识BLE 5协议栈 —— 直接测试模式
  14. 苹果测试软件testflight游戏,教程:如何使用TestFlight 参与App 测试
  15. 为Kong添加服务、路由和认证
  16. SYNPROXY抵御DDoS攻击的原理和优化
  17. python打开xls文件报错_python处理excel文件(xls和xlsx)
  18. JavaScript 笔记之数组
  19. WiFi未来趋势如何?如何搭上物联网这条大船?
  20. centos7 杀不死 httpd (Apache )

热门文章

  1. 编写 android 测试单元该做的和不该做的事
  2. docker相关配置
  3. 喜大普奔,微软Microsoft JDBC Driver For SQL Server已发布到maven中央仓库
  4. Ubuntu下使用VNC
  5. vue 使用axios发送的请求使用md5加密
  6. mysql数据库什么是事件_[数据库]Mysql 事件(定时任务)
  7. Idea 集成Lombok插件
  8. [Java] 蓝桥杯ALGO-125 算法训练 王、后传说
  9. LeetCode 633. Sum of Square Numbers
  10. LeetCode 77. Combinations