最近在维护一个前阵子开发的一个基于Flex的网点Linux前台管理系统,因为某些原因,最近陆续修复了一些Bug以及添加了一些新的功能,但是每次更新了后,都有网点来电话说看到的还是旧版本的系统,这是为什么呢?其实这都是缓存惹的祸…
最近在维护一个前阵子开发的一个基于Flex的网点Linux前台管理系统,因为某些原因,最近陆续修复了一些Bug以及添加了一些新的功能,但是每次更新了后,都有网点来电话说看到的还是旧版本的系统,这是为什么呢?
其实这都是缓存惹的祸,搞Web的朋友应该都知道,我们浏览网页时,浏览器会将我们第一此打开的网页存储到缓存区,然后在显示给我们,在我们第二此访问该网页的时候,浏览器首先会检查缓存时候存在该页面,如果有,该页面是否过期,如果未过期,那么将从缓存中读出页面显示。那么有办法不让我们的页面缓存吗?
在HTTP的头信息中,有些字段就是用来标识该页面不缓存的,对于HTTP1.0使用HTML页面中在<head/>中加入如下标签来设置页面不缓存:
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
而在HTTP1.1中使用,如下标签(注意:Firefox只支持HTTP1.1的方法):
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
另外,如果不放心的话,我们还可以将页面过期时间设置为0,也就是马上过期:
<META HTTP-EQUIV="expires" CONTENT="0">
详细的HTTP头字段的定义请查看这里
以上是针对我们的Flex swf包装HTML页面的设置,这样每次我们打开Flex页面的时候,都是获取最新版本的HTML页面,现在还剩下一个问题,那就是我们的SWF文件如何在有新版本的时候能马上更新呢?
大家都知道,Flash插件也使用与HTML页面类似的方法缓存swf文件,节省我们每次导入swf文件的时间,这是个很好的策略,但是对于我们有新版本swf文件发布的时候,这个缓存的机制就不怎么可爱了,swf中有没有什么特别的参数可以不缓存,而且对于Flex2这样的胖客户端,不缓存对于用户体验也是不利的,这可如何是好?!
还好问题还是有解决的办法的,我们可以从缓存的根本下手,一般缓存都是基于URL的,也就是说对同一个URL的访问,有一个缓存的机制在这里,而对于不同的URL,也就必须读入新的swf重新缓存了。
例如我们通过类似http://blog.eshangrao.com/sample.swf的地址访问编译后的Flex程序swf主文件,根据URL的特性,http://blog.eshangrao.com/sample.swf?version=1.0这样的URL实际访问的还是sample.swf文件,使用这样的URL的话,客户第一次访问我们的swf文件,Flash插件读取http://blog.eshangrao.com/sample.swf?version=1.0对应的sample.swf文件,然后将http://blog.eshangrao.com/sample.swf?version=1.0这个URL对应的文件缓存以便加快以后访问的速度,这样当我们有新版本发布时,比如2.0的版本,这个URL就相应变更为http://blog.eshangrao.com/sample.swf?version=2.0,这样客户端的Flash插件导入的时候,首先查看缓存,因为之前缓存的是http://blog.eshangrao.com/sample.swf?version=1.0这个文件,所以缓存中不存在该URL的缓存,就只能到我们的服务器上读取最新版本的swf文件了。
总结一下,要想在Flex程序有新版本更新的时候,各客户端也自动更新缓存的方法如下:
1、在Flex包装HTML页面的
O comments at "Flex:缓存与版本更新"
Comment Now!