当前位置: 首页 > 编程日记 > 正文

浏览器缓存导致FLASH资源更新问题的解决方案

在网上搜浏览器缓存问题时,遇上了很多问题。一是不知道应该用何种关键字搜索,二是一搜出来,就全是讲的是如何禁用浏览器缓存的方案。

作为大型点的FLASH WEBGAME来说,不缓存显然是不行的。总体上来说,我们要想达到的目标就是

一、浏览器需要缓存

二、当服务器资源更新时,浏览器缓存里相应的老版本资源失效。

下面两篇文章讲到了一个很好的解决方案,并且给出了源码。。

更新文件避免浏览器缓存的解决方案(基于svn)

http://www.itamt.com/2010/06/browser_cache_prevent_base_on_svn/

更新文件避免浏览器缓存的解决方法(源码)

http://www.itamt.com/2010/07/file-revision-prevent-browser-cache-svn/#comment-163

由于作者BLOG上的代码无法下载,并且作者的实现与第一篇中描述的略有差异,于是我试着留言给作者。热心的作者当天就给了我回复。

以下是我整理后的回复内容:

你好, 关于你说的:
1 、你最后的方案是不是 仅仅在资源请求时,追加一个版本号?  我发现IE浏览器缓存是将整个请求URL缓存下来了的。也就是说,版本号也缓存了。 这样,当我们使用版本号请求资源时,就可以实现总是得到服务器上的资源了。
2、IE和Firefox的缓存机制差异有多大?  主要是缓存后的URL路径上。。。

我把我的想法说一下, 尽量表述清楚-_-:

不管IE和Firefox浏览器缓存都是将整个请求url缓存下来的. 而我的解决方案本质与你说的是一样的, 即"仅仅在资源请求时,追加一个版本号".

一般的做法,发布新版本时,比如v1.5,我们大可以在所有资源请求都加上"....?v=1.5", 这样做没有错.肯定是会避免浏览器缓存的.

问题是:这种方法会重新请求所有的资源. 而项目发布的通常情况是:只有少部分资源有修改. 所以这种方法是很浪费带宽的, 也加重了服务器的压力. 理想的情况就是:只重新请求那些被修改过的资源.

下面表述一下我的解决方案:
假设现在项目是v1.0, 我们要发布v1.5上去. 我们利用SVN产生一份文件, 来记录v1.5中所有资源的SVN版本号. 当请求一个资源时, 追加这个资源的SVN版本号. 如果一个资源(比如: icon.jpg, SVN版本号是1010)在v1.5中没有被修改, 那么它的SVN版本号与在v1.0的SVN版本号肯定是一样的都是1010:
在v1.0中,浏览器请求icon.jpg的url是:http://.....icon.jpg?svn=1010
在v1.5中,浏览器请求icon.jpg的url是:http://.....icon.jpg?svn=1010, 这时候会直接从浏览器缓存中取出. 不会重新请求.

如果v1.5中一个资源(比如: logo.jpg, SVN版本号是1234)是修改过的, 它在v1.0的SVN版本号是1222, 请求资源时:
在v1.0中,浏览器请求icon.jpg的url是:http://.....logo.jpg?svn=1222
在v1.5中,浏览器请求icon.jpg的url是:http://.....logo.jpg?svn=1234, 这时候与浏览器缓存中的请求是不一样的. 所以会重新向服务端请求.

思路就是这样的. 所以关键是利用SVN来记录的版本号请求资源.

这个解决方案最终实现出来主要是两个文件.
1.cur.txt记录整个项目当前的SVN版本号.
2.revision.txt记录项目当前版本中所有资源的SVN版本号.

整个项目程序一开始(Preloader.swf), Preloader.swf会先确定整个项目SVN版本号(加载最新cur.txt, 或者在网页中指定:...Preloader.swf?cur=20), 然后根据整个项目SVN版本号加载revision.txt, 比如现在项目SVN版本是20, 那么Preloader.swf会加载:
http://.....revision.txt?svn=20
加载完成后, 就可以完成mFileRevisionManager的初始化...

注意Preloader.swf不是进度条(load.swf), 它是整个项目最开始的地方, 所以应该尽可能小, 而且一旦完成最不要再去修改它.

附件里,有我做的demo. 我的开发环境是FDT4.5+Flash CS5.5, 文件夹tool里一个ant脚本, 和jsfl脚本. 使用时你需要修改publish.xml开头的路径. 然后运行这个ant脚本.

image

运行ant前, 注意设置下:这样ant运行期间的输出信息会显示在eclipse里.

image

---------------------------------------------------------------

并且,我问了一下他对Preloader.swf的理解和用法

回复:

结合我参与的项目,说一下Preloader.swf是干么用的:
一般项目肯定会有一个load.swf和main.swf, 其中
1.load.swf用于显示加载main.swf的进度,说白了load.swf就是个进度条.
2.main.swf就是整个项目的主程序.
而Preloader.swf是在load.swf之前加载的.也就是说加载顺序是Preloader.swf->load.swf->main.swf
Preloader.swf主要用来加载"资源版本号文件"(revision.txt, cur.txt). 并且把整个资源版本机制初始化(在我的方案里就是mFileRevisionManager).

当然, 也完全可以把Preloader.swf并入load.swf(进度条)中. 但我的经验是load.swf(进度条)其实是经常需要修改更新的. 而且为了重用性考虑, 我会把Preloader.swf用于不同的项目中. 所以把Preloader.swf与load.swf分开.

-----------------------------分割线--------------------------------

而考虑到目前项目的原因,我们决定暂时采用一个很简单的方案。 就是在资源的根目录下加版本号。

比如 1.0.0版本的资源目录为

Assets_v1.0.0

我要加载一个ui.swf的URL就是  “Assets_v1.0.0/ui.swf”

而当版本更新时,比如到了1.0.1

我要加载一个ui.swf的URL就是 “Assets_v1.0.1/ui.swf”

这样就像回复内容中说的,这会使浏览器缓存中所缓存的所有资源都失效。 虽然是如此,但总比用户继续使用老版本资源好。 并且,对于一个发布版的更新总会有时间间隔的,不会一天到晚都是这样的情况。

而待项目趋于稳定后,再集中替换成上面那种最小资源更新的解决方案。

希望上面的信息能够帮助到和我一样迷惑的人。如果这些信息帮助到了你,请去参拜本文开头引用的两篇文章的作者,谢谢!!!!!!

转载于:https://www.cnblogs.com/qilinzi/archive/2011/10/12/2209493.html

相关文章:

技术图文:Python的属性装饰器详解

背景 我们在以前的一篇图文 Python基础 – Task10. 类与对象 中介绍过利用property()方法既能保护类的封装特性,又能让开发者可以使用“对象.属性”的方式操作类属性。 class property([fget[, fset[, fdel[, doc]]]])用于在新式类中返回属性值。 fget – 获取属…

又一个强大的PHP5.3依赖注入容器

简单的服务容器 一个简单的 php 5.3 依赖注入容器。 项目地址:https://github.com/godruoyi/easy-container Why 目前比较流行的 PHP 容器: PimpleLaravel Container其他依赖注入容器Pimple 是一个简单优秀的 php 5.3 容器,也是目前用得最多的…

软件测试培训:如何搭建测试环境

如何搭建测试环境?这是很多测试人员都需要了解的,测试是每个产品上线前必备的一个检验,不管是什么产品,做好有效的测试是对产品质量的一个负责,软件测试环境要考虑的就是软件在什么软硬件下能正常运行,什么环境下不能…

技术图文:如何爬取一个地区的气象数据(上)?

背景 架空线路主要指架空明线,架设在地面之上,是用绝缘子将输电导线固定在直立于地面的杆塔上以传输电能的输电线路。架设及维修比较方便,成本较低,但容易受到气象和环境(如大风、雷击、污秽、冰雪等)的影…

C#按关闭按钮实现最小化,按ESC才关闭的实现【含系统消息大全】

protected override void WndProc(ref Message m) { const int WM_SYSCOMMAND 0x0112; const int SC_CLOSE 0xF060; if (m.Msg WM_SYSCOMMAND && (int)m.WParam SC_CLOSE) { // 屏蔽传入的消息事件 …

眠眠interview Question

1. Wkwebkit在异步回调 如何像webview的回调 一样在主线程回调。可以使用runloop 解决么? dispatch get main queue http://www.jianshu.com/p/a2fc399075e0 转载于:https://www.cnblogs.com/tufei7/p/7657617.html

哪些人适合参加软件测试培训

软件测试是现在很多企业需求都非常大的一个岗位,只要是互联网行业基本都是有需求的,那么想要学习软件测试,哪些人适合参加软件测试培训呢?来看看下面的详细介绍。 哪些人适合参加软件测试培训? 想从零开始进入软件技术行业 软件测试的优势是…

从iso镜像升级ubuntu

步骤: 1.从网上下载Alternate版本的ISO镜像 2.加载ubuntu镜像 # mount -t iso9660 -o loop ubuntu-11.10-alternate-i386.iso /mnt/cdrom/3.进入/mnt/cdrom/ 运行cdromupgrade 程序 # cd /mnt/cdrom/ # ./cdromupgrade转载于:https://www.cnblogs.com/dudp/archive…

技术图文:如何爬取一个地区的气象数据(下)?

背景 架空线路常见的故障有:风偏闪络故障、雷击跳闸故障、雷击断股故障、线路覆冰故障、线路污闪故障、线路外力破坏故障、线路鸟害故障等等。从这些故障中,我们可以看出天气对线路的安全运行起到非常重要的作用。 在上一篇图文 如何爬取一个地区的气象…

Android :landscape||portrait 切换

可在AndroidManifest.xml里面配置屏幕发现。 在<Activity>中加入这一行android:screenOrientation"landscape/portrait " android中每次屏幕的切换动会重启Activity&#xff08;可以在Activity销毁前保存当前活动的状态&#xff0c;在Activity再次Create的时候…

web前端开发培训完就业前景怎么样

很多人都在学习web前端技术&#xff0c;认为学好这一项编程技术&#xff0c;找工作是非常稳定的&#xff0c;那么到底web前端开发培训完就业前景怎么样呢?来看看下面的详细介绍就知道了。 web前端开发培训完就业前景怎么样? web前端薪资待遇 从图中我们能够看到web前端从业者…

技术图文:如何改进算法的运行效率?

背景 前段时间&#xff0c;一位好友发给我如下的文件&#xff1a; 每个CSV文件中的数据由三个属性组成&#xff0c;第一个属性为ID&#xff0c;第二个属性为X坐标&#xff0c;第三个属性为Y坐标。由于是二维数据&#xff0c;可以绘制出每个文件的散点图&#xff0c;把这些散点…

B树,B+树,B-树和B*树

B树 即二叉搜索树&#xff1a; 1.所有非叶子结点至多拥有两个儿子&#xff08;Left和Right&#xff09;&#xff1b; 2.所有结点存储一个关键字&#xff1b; 3.非叶子结点的左指针指向小于其关键字的子树&#xff0c;右指针指向大于其关键字的子树&#xff1b; 如&#xff1a; …

JS对象直接量,数组直接量和函数直接量

对象直接量创建一个对象&#xff1a; var obj {x:[1,2],y:23}; 代码跟下面是一样的。 var objnew Object(); obj.xnew Array(1,2); obj.y23; 测试&#xff1a;for(var i in obj) alert(obj[i]); 函数直接量&#xff1a;它是一个表达式而不是语句。 (function(){})() 如下例&am…

学习Java编程培训的书籍有哪些

学习java技术除了线上线下的培训学习&#xff0c;书籍的知识也是非常重要的&#xff0c;今天小编为大家整理的就是学习Java的一些书籍&#xff0c;Java书籍是程序员学习提升技能的重要学习渠道&#xff0c;通过书籍Java程序员可以学习当前流行、重要的相关技能。下面我们一起来…

Datawhale组队学习:数据结构与算法课程任务

背景 Datawhale 是国内很有名的一个开源学习组织。这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起&#xff0c;营造出一种互促高效的学习环境&#xff0c;一起为开源学习付出努力。 Datawhale 近期将推出三门课程的组队学习。我先将 数据结构与算法&…

live555学习笔记2-基础类

二 基础类 讲几个重要的基础类&#xff1a; BasicUsageEnvironment和UsageEnvironment中的类都是用于整个系统的基础功能类&#xff0e;比如UsageEnvironment代表了整个系统运行的环境&#xff0c;它提供了错误记录和错误报告的功能&#xff0c;无论哪一个类要输出错误&#x…

自己写的小工具集合

2019独角兽企业重金招聘Python工程师标准>>> 文件夹大小查看工具 用于查看文件夹下每个子文件和子文件夹的大小.以前想统计文件夹大小,只能点右键看属性,而且只能看到文总大小。这个小工具可以通过右键启动,而且能查看文件夹下所有文件和文件夹的大小. 以前用过类似…

哪些人适合学软件测试呢

软件测试是现在很多企业的一个刚需岗位&#xff0c;所以软件测试的发展前景是非常好的&#xff0c;想要了解哪些人适合学软件测试呢?来看看下面的详细介绍就知道了。 哪些人适合学软件测试呢? 1.无编程基础 测试的代码量仅为20%左右&#xff0c;无论是文科生还是非计算机专业…

javabean和EJB的区别

Java Bean 是可复用的组件&#xff0c;对Java Bean并没有严格的规范&#xff0c;理论上讲&#xff0c;任何一个Java类都可以是一个Bean。但通常情况下&#xff0c;由于Java Bean是被容器所创建(如Tomcat)的&#xff0c;所以Java Bean应具有一个无参的构造器&#xff0c;另外&am…

Datawhale组队学习:初级算法梳理课程任务

背景 Datawhale 是国内很有名的一个开源学习组织。这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起&#xff0c;营造出一种互促高效的学习环境&#xff0c;一起为开源学习付出努力。 Datawhale 近期将推出三门课程的组队学习。我先将 初级算法梳理 的任务…

CSS将长文字换行的方法 (转)

大家都知道连续的英文或数字能是容器被撑大&#xff0c;不能根据容器的大小自动换行&#xff0c;下面是 CSS如何将他们换行的方法&#xff01; 对于div 1.&#xff08;IE浏览器&#xff09;white-space:normal; word-break:break-all;这里前者是遵循标准。 #wrap{white-space:n…

学Java的软件哪些比较好用

很多java程序猿在工作的时候都会用一些辅助工具&#xff0c;辅助工具可以很好的帮助程序猿高效率的完成工作&#xff0c;那么具体学Java的软件哪些比较好用呢?来看看下面的详细介绍。 学Java的软件哪些比较好用? 1. Eclipse Eclipse做为一款开发源代码的Java扩展性开发平台&a…

DataTable的Compute功能详解

在为筛选器创建表达式时&#xff0c;用单引号将字符串括起来&#xff1a;"LastName Jones"下面的字符是特殊字符&#xff0c;如下面所解释的&#xff0c;如果它们用于列名称中&#xff0c;就必须进行转义&#xff1a;\n (newline)\t (tab)\r (carriage return)~()#\…

Datawhale第九期组队学习计划

Datawhale 组队学习 第九期Datawhale组队学习计划马上就要开始啦&#xff01; 这次共组织三个组队学习&#xff0c;涵盖了编程、机器学习理论以及动手实践的内容&#xff0c;大家可以按照需要选择参加。 数据结构与算法&#xff08;上&#xff09; 内容设计&#xff1a;光城…

Hibernate获取数据java.lang.StackOverflowError

原因&#xff1a;因为在重写toString()方法时&#xff0c;把关联的属性也放入到toString方法中了&#xff0c;去掉就可以了。 如&#xff1a;重写的toString方法中不能有关联关系IDCard属性idCard public class Person {private Integer id;private String name;private IDCard…

UI设计培训之UI设计系统知识

最近有很多小伙伴都在学习UI设计的相关知识&#xff0c;很多同学都是东边一学习一下&#xff0c;西边学习一下&#xff0c;根本没有明确的学习方法&#xff0c;对于这个问题小编为大家整理了一下学习UI设计的系统知识&#xff0c;一起看看吧! UI设计培训之UI设计系统知识&#…

java 中的 Enumeration 在Vector,Hashtable和web中的应用

public interface Enumeration<E> 实现 Enumeration 接口的对象&#xff0c;它生成一系列元素&#xff0c;一次生成一个。连续调用 nextElement方法将返回一系列的连续元素。 例如&#xff0c;要输出 Vector<E> v的所有元素&#xff0c;可使用以下方法&#xff1a;…

Datawhale组队学习 Task01:数组(1天)

Task01&#xff1a;数组&#xff08;1天&#xff09; 1. 数组的定义 数组是具有一定顺序关系的若干对象组成的集合&#xff0c;组成数组的对象称为数组元素。 例如&#xff1a; 向量对应一维数组矩阵对应二维数组 数组名表示群体的共性&#xff0c;即具有同一种数据类型&a…

IOS一些显示效果和动画效果资料

2019独角兽企业重金招聘Python工程师标准>>> 1.基于AutoLayout的UIScrollView悬停Tab 转载于:https://my.oschina.net/zhugenqiang/blog/1551389