2012-07-13 13 views
22

Ho installato un'app e funziona perfettamente su Opera e Firefox, ma su Google Chrome memorizza nella cache la richiesta AJAX e fornirà dati obsoleti!Impedire la memorizzazione nella cache di Chrome Richieste AJAX

http://gapps.qk.com.au è l'app. Quando viene eseguito in Chrome, non invia nemmeno le richieste AJAX, ma quando viene provato in un altro browser fa sempre la richiesta AJAX e restituisce i dati.

C'è qualche metodo (Apache/PHP/HTML/JS) per impedire a Chrome di eseguire questo comportamento?

La chiamata AJAX:

function sendAjax(action,domain,idelement) { 

        //Create the variables 
       var xmlhttp, 
        tmp, 
        params = "action=" + action 
          + "&domain=" + encodeURIComponent(domain) 

        xmlhttp = new XMLHttpRequest(); 
       //Check to see if AJAX request has been sent 
       xmlhttp.onreadystatechange = function() { 
        if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { 
         $('#'+idelement).html(xmlhttp.responseText); 
        } 
       }; 
       xmlhttp.open("GET", "ajax.php?"+params, true); 
       xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
       //console.log(params); 
       xmlhttp.send(params); 

      } 
sendAjax('gapps','example.com','gapps'); 
+0

Quali sono le intestazioni restituite dallo script PHP? Assicurati che non consentano la memorizzazione nella cache e restituisca un tipo di contenuto appropriato. – mariusnn

risposta

26

la cache del browser si comporta in modo diverso su diverse impostazioni. Non dovresti dipendere dalle impostazioni dell'utente o dal browser dell'utente. È anche possibile che il browser ignori anche le intestazioni.

Esistono due modi per impedire la memorizzazione nella cache.

-> Modificare la richiesta AJAX su POST. I browser non memorizzano nella cache le richieste POST.

-> Modo migliore & buon modo: aggiungere un parametro aggiuntivo alla richiesta con il timestamp corrente o qualsiasi altro numero univoco.

params = "action=" + action 
     + "&domain=" + encodeURIComponent(domain) 
     + "&preventCache="+new Date(); 
+0

Stavo pensando a questa come soluzione, ma ho pensato che fosse inelegante, ok grazie! :) – Mattisdada

+1

Solo per informazioni e tranquillità. questa soluzione viene utilizzata dai principali framework quando dici che preventCache chiama ajax un esempio è DOJO. aggiungere un numero invece della data – gaurang171

+0

Davvero? Questo mi sembra un metodo "hacky" per me, funziona (ottimo), ma avrei pensato che ci sarebbe stato un metodo migliore come modo "ufficiale" di farlo. Grazie ancora! :) – Mattisdada

11

Un'altra alternativa alla soluzione Javascript è quello di utilizzare le intestazioni personalizzate: In PHP sarebbe simile a questa:

<?php 
    header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");//Dont cache 
    header("Pragma: no-cache");//Dont cache 
    header("Expires: Thu, 19 Nov 1981 08:52:00 GMT");//Make sure it expired in the past (this can be overkill) 
?> 
+0

Funziona con tutti i browser? Se è così, questo è ** molto ** più elegante della query param hack ... – tjameson

+1

Sì, funziona con tutti i browser :) – Mattisdada

0

Sotto riga di codice ha lavorato per me.

$.ajaxSetup({ cache: false }); 
Problemi correlati