龍行天下

            政 博
          隨筆 - 23, 文章 - 0, 評論 - 12, 引用 - 0

          導航

          <2009年10月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          怎么避免瀏覽器緩存靜態(tài)文件

          對于動態(tài)文件,比如 index.asp?id=...  或者 index.aspx?id=... 相信有經(jīng)驗的程序員都知道怎樣禁止瀏覽器緩存數(shù)據(jù)了.
          但是對于靜態(tài)文件(css,jpg,gif等等), 在什么場合下面我們需要禁止瀏覽器緩存他們,怎么做?

          本文討論的主題是如何防緩存, 尤其是如何防止靜態(tài)文件被緩存..


          在  RE:對博客園URL的一些調(diào)整建議, 二級域名不利于客戶端瀏覽器緩存 一文中,我提到了怎么最大化的
          利用瀏覽器緩存功能,來提高客戶端瀏覽速度, 減輕服務(wù)器負擔的.

          但是事物總是一分為二的,并不是所有的場合都要使用緩存的. 有時候我們的數(shù)據(jù)被緩存了反而會給我們帶來麻煩.

          對于動態(tài)數(shù)據(jù)(從數(shù)據(jù)庫讀取生成的那些),我們可以通過以下方法來禁止瀏覽器緩存。

          'asp 為例 禁止緩存

          Response.Buffer 
          = True 
          Response.ExpiresAbsolute 
          = Now() - 1 
          Response.Expires 
          = 0 
          Response.CacheControl 
          = "no-cache" 
          Response.AddHeader 
          "Pragma""No-Cache" 

          對于Ajax 的請求(不管是靜態(tài)數(shù)據(jù)還是動態(tài)數(shù)據(jù)):

          //以下三種方法使用其中任何一種方法都可以
          xmlhttp.setRequestHeader("Cache-Control","no-cache");  
          //或者
          xmlhttp.setRequestHeader("If-Modified-Since","0");
          //或者
          xmlhttp.Open(url+'?rnd='+Math.random(),....)

          如果使用 prototype.js  , 用類似這樣的代碼 
          new Ajax.Request(url,{method:"get",requestHeaders:["Cache-Control","no-cache"]})
          或者
          new Ajax.Request(url,{method:"get",requestHeaders:["If-Modified-Since","0"]})
           

          什么情況下,要禁止靜態(tài)文件緩存:
          1、經(jīng)??赡芤膭拥?js, css.
                 比如 一個html 文件, test.html 在 1.0版本中??赡苁沁@樣
               <script src="common.js"></script>
               修改后  v1.1版本:
           <script src="common.js"></script>
           <script src="foo.js"></script>
             新增加了一個foo.js  同時,也改動了common.js , 在common.js 中定義了新的類,并在foo.js 中使用了common.js. 

          在這種情況下如果以前用戶瀏覽過 1.0版本的 html 文件,那么他的瀏覽器自動緩存了 common.js
          當他瀏覽新版本的時候,因為使用的是 v1.1的 foo.js 和 v1.0的 common.js ,這樣將導致腳本出錯。


          解決方法探討:
            因為css,js 是通過 <script src=....> 這種方式加載的,所以,很難使用 asp 的那種服務(wù)器端禁止緩存的辦法。也很難使用ajax的通過設(shè)置 http請求頭的辦法禁止使用緩存。

          看來隨機數(shù)是個好辦法。

          //方法一:
          document.write("<script src='test.js?rnd="+Math.random()+"'></s"+"cript>")

          //方法二:
          var js=document.createElement("script")
          js.src
          ="test.js"+Math.random()
          document.body.appendChild(js)


          但是,如果采用隨機數(shù)的話, js文件將永遠得不到緩存,每次都必須重新從服務(wù)器加載,即使沒有任何更改。
          大家如果經(jīng)常上國外網(wǎng)站的話,可以看到他們通常采用這樣的方式來解決:
          <script src="test.js?ver=113"></script>
          其中 ver=113 的 113就是版本號,一般都是采用 CVS 或其他工具生成的開發(fā)版本號。

          這樣真正做到了應(yīng)該緩存的時候緩存靜態(tài)文件,當版本有更新的時候從獲取最新的版本,并更新緩存。
          對于圖像 <img src="test.jps?ver=在CVS的版本號"> 來有效利用和更新緩存.


          唉,現(xiàn)在在CSDN的Web版,不知道有多少人在重復問著同一個問題。“怎么通過程序刪除清空客戶端的瀏覽器緩存”.........

           

          未完待續(xù):

          下一篇:  利用瀏覽器緩存來改善用戶體驗。。。。Ajax模式之預先加載

          敬請關(guān)注,等我寫完再加上鏈接

          posted on 2008-01-03 09:19 feingto 閱讀(2571) 評論(1)  編輯  收藏 所屬分類: Java Web

          評論

          # re: 怎么避免瀏覽器緩存靜態(tài)文件  回復  更多評論   

          你的文章解決了我的問題, 多謝多謝
          2009-10-20 16:46 | jruv
          主站蜘蛛池模板: 陇南市| 栾川县| 扎鲁特旗| 迭部县| 英山县| 建平县| 滁州市| 墨竹工卡县| 伽师县| 西林县| 大化| 砀山县| 阳西县| 阿图什市| 福清市| 菏泽市| 双流县| 兴业县| 临高县| 大渡口区| 鲁甸县| 隆尧县| 清河县| 连云港市| 邹平县| 青田县| 黄山市| 外汇| 年辖:市辖区| 区。| 易门县| 彭州市| 土默特左旗| 德格县| 南江县| 馆陶县| 台山市| 环江| 新巴尔虎左旗| 安龙县| 浑源县|