您的位置:首页 > 其它

一种让swf文件不写入浏览器缓存的实现方法

2011-01-17 12:36 204 查看
先总结下这几天一直为了解决这个问题试的几种其他的办法:
方法一:《在Asp页面首部加入 》
Response.Buffer = True
Response.ExpiresAbsolute = Now() - 1
Response.Expires = 0
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "No-Cache"
这方法是刚才在网上搜的“不缓存网页的”代码!可是对FLASH没想到不起作用.
方法二:《让SWF文件不显示在IE缓存中》
实现方法就是在Apache Server配置文件(httpd.conf)中加入下面几句:
ExpiresActive On
header append cache-control: "no-cache"
header append pragma: "no-cache"
header append expires: "-1"
下面是个例子:
http://www.oddhammer.com/tutorials/nocache/SWF_security.html
注意:这种方法只是让Flash不显示在客户端的IE临时文件夹中,但不能防止被直接下载.并且对FireFox浏览器无效.
最终结论是:无论你怎么弄,SWF还是一样被下载.
最后补充:
不显示不等于没有保存在缓存中.用下面的方法就可以找出来.



方法三:《彻底解决swf浏览器的缓存问题》 引用:

为确保flash加载的是最新的变量,附加一个随机数变量,这样就可以原始档中加载最新的数据
例如:
方法一:
loadVariables("mypage.asp?nocache=" + random(65000), 0, "POST";
方法二:
loadVariables("mypage.asp?nocache=" + getTimer(), 0, "POST";
这样确保每次加载的数据是最新的.
[补充]
然而在实践中,我取发现在页面含有SWF文件时使用MM提供的方法,有时不是很灵验。
经过不断的测试,我发现使用一下的方法可以百分之百的解决flash读取本地缓存的问题
首先我们来看看页面中包含flash文件的代码:
<object classid="clsid27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="550" height="400" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="waizi.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="waizi.swf" quality="high" bgcolor="#ffffff" width="550" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
其红色的部分就是代表你要调用的flash 资源。我们可以简单的在其后附加一个变量就可以强制页面每次都从服务器端调用最新的SWF文件。
例如:xxxx.swf?rand=12334567
方法一: 如果是HTML页面,其不能自动改变变量的值,所以当你的SWF文件修改后上传服务器,你只要手工修改rand变量后面的数值就可以防止页面读取本地的SWF文件信息。
方法二: 如果你的页面是asp,php动态页面,则可以通过脚本来实现其动态修改变量值。
例如在asp页面中,使用vbscript产生一个随机数
<%
dim num
Randomize
num=Int((1000000*Rnd)+1)
%>
然后在你那一堆置入SWF文件的代码中,找到SWF文件名,并修改其为:
<param name=movie value="****.swf?rand=<%=num%>">
embed src="****.swf?rand=<%=num%>"
记住是两个地方,因为其适用于不同的浏览器。
如果使用javascript可以这样:
<script language="JavaScript">
function Rand(){
var Num=Math.floor(Math.random()*1000000);
document.write(Num);
}
</script>
然后在调用flash代码的地方修改为:
****.swf?rand=<script language="JavaScript">getRand();</script>
记得是一般要改两个地方。一个<object>用于IE的 一个<embed>用于非IE浏览器的
现在想想有了问题,第一个寻找答案的地方就是去adobe网站上查询。
★、上边几种办法是我在客服端上都实验了的,不知道哪还有什么问题还是没解决。
接下来再列出二种修改服务器端来控制的方法:
1、IIS服务器
一般的我们对于动态页面(asp,php等)禁止缓存都是通过语言本身设置HTTP头来实现的,但swf不能直接设置HTTP头。办法就是可以从服务端着手,在IIS里添加HTTP头:
cache-control: "no-cache"
pragma: "no-cache"
expires: "-1"
操作方法见图示:



但在设置IIS时要注意,如果对整个网站设置了HTTP头,则整站的内容(如jpg,gif,css,html等)都不会被缓存了,这样会导致每次都要重新下载这些文件,不好。那么可以更进一步,在网站下创建一个虚拟目录,然后对此虚拟目录设置HTTP头,把禁止缓存的swf文件放在其中。
2、Apache服务器
同上的方法二↑
最后重点推荐的一种方法,也是我目前感觉能最大可能性解决问题的办法!
这种方法需要用到AS3技术了。
这是一个案例网站:www.sony.com(有兴趣可以进去看看) 引用:

AS3的Loader类提供了loadBytes方法,可以通过ByteArray中读取swf,jpg,png和gif格式的文件。如果通过AS3的Socket类接收文件,然后通过Loader的loadBytes方法加载,加载后的文件因为不通过HTTP协议,将不会被写入浏览器的缓存中。
在该实现方法中,client使用的是AS3,server使用的JAVA。具体操作流程如下:
(server)在服务器端创建一个新的ServerSocket,监听端口等待服务器连接;
(client)创建新的Socket实例,连接server;
(server)得到来自client的连接,获取连接信息,判断连接合法性;
(server)通过File类获取client需要的文件,通过DataOutputStream将此文件发送到连接通道;
(client)socket对象通过onData事件监听获取传输过来的二进制数据,并依次保存于一个ByteArray中;
(server)当文件发送完成以后,关闭client的连接;
(client)socket对象通过onClose事件监听得知数据发送完成;
(client)创建Loader对象,通过Loader的loadBytes方法加载文件。
整个流程很简单,使用此方法,加载到的文件都只能在客户端的内存中运行,将不会保存在任何缓存中。
这整个实现过程中,因为第一次访问的必要,需要有一个loader.swf文件。此文件需要用户通过浏览器访问,因此可以在此文件中实现该加载方法,用来加载一个真正运行的swf文件。而这个关键的运行文件,将不会在缓存中出现。而用来加载的loader.swf文件,将依旧会被保存在缓存中。
该实现方法,只能简单的做到被加载的swf文件或者图片,是通过可控方式得到的,不会随意的被其他用户通过HTTP直接读取。但是对于彻底的文件保密,由于swf文件的执行必须在客户端实现,因此无法做到彻底屏蔽。如果用户通过内存监听或者破解loader.swf文件后,获取服务器信息并通过此服务器获取、转移并保存文件的二进制数据,这种方式也是可以被破解的。
至于不将文件保存在缓存导致的加载速度问题,肯定会有所影响。但是高速的缓存读取和耗时的服务器读取,必定只能选择其一,是无法避免的。
附带两个文件,一个是AS3的类,用来连接服务器、请求文件和加载文件。一个是JAVA类,用来处理请求并将文件发送给客户端。两个类都只是实现过程的处理展示,并不能直接独立运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: