2012-02-08 361 views
5

JavaScript或C#中有沒有一種方法可以判斷某人正在使用的瀏覽器是否禁用了靜態內容緩存?如何檢查瀏覽器緩存是否被禁用

我需要能夠測試瀏覽器是否針對緩存進行了優化。

+0

打算什麼你的意思是說「瀏覽器爲緩存而優化」?它是否支持etag或某些特定的緩存頭? – 2012-02-09 00:39:34

+0

您可以在瀏覽器設置中禁用靜態文件的存儲。有什麼方法可以測試該存儲是否被禁用? – gaffleck 2012-02-09 00:41:34

回答

2

UPDATE

我做的問題有點多的調查,你可以找到更詳細的answer in my recent post 注意,下面描述的解決方案(最初)是不是跨瀏覽器解決方案。

不知道它是否有幫助,但你可以嘗試以下技巧: 1.添加一些資源給你的頁面,讓我們說這將是JavaScript文件cachedetect.js。 2.每次有人請求時,服務器應該生成cachedetect.js。並且它應該包含與緩存相關的響應頭,即如果啓用了瀏覽器緩存,資源應該被緩存很長時間。每個cachedetect.js應該是這樣的:

var version = [incrementally generated number here]; 
var cacheEnabled; //will contain the result of our check 
var cloneCallback;//function which will compare versions from two javascript files 

function isCacheEnabled(){ 
    if(!window.cloneCallback){ 
     var currentVersion = version;//cache current version of the file 
     // request the same cachedetect.js by adding <script> tag dynamically to <header> 
     var head = document.getElementsByTagName("head")[0]; 
     var script = document.createElement('script'); 
     script.type = 'text/javascript'; 
     script.src = "cachedetect.js"; 
     // newly loaded cachedetect.js will execute the same function isCacheEnabled, so we need to prevent it from loading the script for third time by checking for cloneCallback existence  
     cloneCallback = function(){ 
      // once file will be loaded, version variable will contain different from currentVersion value in case when cache is disabled 
      window.cacheEnabled = currentVersion == window.version;   
     };  
     head.appendChild(script); 

    } else { 
     window.cloneCallback(); 
    } 
} 

isCacheEnabled(); 

之後,你可以在一段時間後簡單地檢查cacheEnabled === truecacheEnabled === false

+0

我喜歡這種方法,但我還沒有完全理解它。我會給它一個鏡頭,讓你知道我找到了什麼。謝謝您的幫助! – gaffleck 2012-02-09 18:29:49

+0

基本上它會多次加載相同的腳本(但使用不同的版本變量),並查看版本變量是否已更改。如果文件直接來自服務器(因爲它每次生成該文件),它將被改變,如果它來自瀏覽器緩存,它(版本變量)將是相同的。 – 2012-02-09 20:12:05

0

我認爲這應該工作:http://jsfiddle.net/pseudosavant/U2hdy/

基本上你要預加載文件兩次,並檢查了多長時間。第二次應該少於10ms(在我自己的測試中)。你會希望確保你正在測試的文件足夠大,需要稍微下載,但它不一定非常大。

var preloadFile = function(url){ 
    var start = +new Date(); 
    var file = document.createElement("img"); 
    file.src = url; 
    return +new Date() - start; 
}; 

var testFile = "http://upload.wikimedia.org/wikipedia/en/thumb/d/d2/Mozilla_logo.svg/2000px-Mozilla_logo.svg.png" 
var timing = []; 
timing.push(preloadFile(testFile)); 
timing.push(preloadFile(testFile)); 

caching = (timing[1] < 10); // Timing[1] should be less than 10ms if caching is enabled 
+0

時間可能因設備的網絡可靠性而異(即使對於兩個相應的請求)。我建議避免這種檢查... – 2012-02-09 01:05:17

+0

我進一步研究它,是的,這方面的任何事情都將成爲黑客攻擊。我嘗試了各種確定下載時間的方法,如果它不是緩存命中,並且持續時間大於10ms,並且如果是,則持續時間小於10ms,FWIW。 – pseudosavant 2012-02-09 03:07:01

0

另一種涉及客戶端和服務器的方法。

  1. 撥打一個頁面/端點,它將設置一個隨機唯一的ID作爲響應。設置緩存頭此頁/端點
  2. 再犯同樣的電話,這將設置不同的唯一編號
  3. 如果數字匹配它從緩存中來,或是從服務器
相關問題