2012-02-08 18 views
5

C'è un modo in Javascript o C# per dire se il browser utilizzato da qualcuno ha disattivato il caching del contenuto statico?Come verificare se il caching del browser è disabilitato

Devo essere in grado di verificare se il browser è ottimizzato per la memorizzazione nella cache.

+0

Cosa intendi dicendo "il browser è ottimizzato per il caching"? Supporta etag o qualche intestazione della cache specifica? –

+0

È possibile disabilitare la memorizzazione di file statici nelle impostazioni del browser. C'è un modo per testare se quella memoria è disabilitata? – gaffleck

risposta

2

UPDATE

ho fatto un po 'di più un'indagine del problema e si possono trovare più dettagliate answer in my recent post nota, la soluzione descritta di seguito (inizialmente) non è una soluzione cross browser.

Non sono sicuro che sia d'aiuto, ma puoi provare il trucco seguente: 1. Aggiungi una risorsa alla tua pagina, diciamo che sarà il file javascript cachedetect.js. 2. Il server dovrebbe generare cachedetect.js ogni volta che qualcuno lo richiede. E dovrebbe contenere intestazioni relative alla cache in risposta, vale a dire se la cache del browser è abilitata, la risorsa dovrebbe essere memorizzata nella cache per un lungo periodo. Ogni cachedetect.js dovrebbe assomigliare a questo:

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(); 

Dopo di che si può semplicemente verificare la presenza di cacheEnabled === true o cacheEnabled === false dopo un certo periodo di tempo.

+0

Mi piace questo approccio anche se non lo capisco ancora completamente. Farò un tentativo e ti faccio sapere cosa trovo. Grazie per l'aiuto! – gaffleck

+0

Fondamentalmente carica lo stesso script (ma con una variabile di versione diversa) più volte e controlla se la variabile di versione è stata modificata o meno. Verrà modificato se i file provengono direttamente dal server (ogni volta che genera questo file), e (versione variabile) sarà lo stesso se proviene dalla cache del browser. –

0

credo che questo dovrebbe funzionare: http://jsfiddle.net/pseudosavant/U2hdy/

In pratica dovete precaricare un file due volte e verificare il tempo impiegato. La seconda volta dovrebbe richiedere meno di 10 ms (nei miei test). Dovrai assicurarti che il file che stai testando sia sufficientemente grande che ci vuole un po 'per scaricarlo, ma non deve essere enorme.

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

Il tempo può variare in base all'affidabilità della rete del dispositivo (anche per due richieste successive). Suggerirei di evitare tali controlli ... –

+0

Ho esaminato ulteriormente, e sì, qualsiasi cosa in questa zona sarà un hack. Ho provato vari modi per determinare il tempo di download e ha richiesto costantemente> 10ms se non era un hit memorizzato nella cache e meno di <10ms se lo era, FWIW. – pseudosavant

0

Un altro approccio che coinvolge client e server.

  1. Effettuare una chiamata a una pagina/punto finale, che imposterà un ID univoco casuale in risposta. Impostare l'intestazione cache per questa pagina/endpoint
  2. Fai di nuovo la stessa chiamata, che consentirà di definire un diverso numero unico
  3. Se i numeri corrispondono è venuta dalla cache o è proveniente dal server di
Problemi correlati