摘要:解決flash(swf)在瀏覽器的暫存檔而無法讀到最新版本問題(轉載)
來源:http://www.360doc.com/content/11/0308/12/2961363_99190770.shtml
轉載內容:
先總結下這幾天一直為了解決這個問題試的幾種其他的辦法:
方法一:《在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類,用來處理請求並將文件發送給客戶端。兩個類都只是實現過程的處理展示,並不能直接獨立運行。