Domanda

Sembra come se io carico il contenuto dinamico utilizzando $.get(), il risultato è memorizzato nella cache del browser.

L'aggiunta di qualche stringa casuale in QueryString sembra risolvere questo problema (io uso new Date().toString()), ma questo si sente come un hack.

C'è qualche altro modo per raggiungere questo obiettivo?O, se la stringa è l'unico modo per raggiungere questo obiettivo, tutti i suggerimenti di altri new Date()?

È stato utile?

Soluzione

Io uso new Date().getTime(), che eviterà le collisioni a meno che non si dispone di più le richieste che accadono all'interno dello stesso millisecondo:

$.get('/getdata?_=' + new Date().getTime(), function(data) {
    console.log(data); 
});

Modifica Questa risposta è di diversi anni. Funziona ancora (e quindi non l'ho eliminato), ma ci sono migliori / modi più puliti di raggiungere questo ora . La mia preferenza è per questo metodo , ma questa risposta è anche utile se si desidera disabilitare la cache per tutti richiesta durante la vita di una pagina.

Altri suggerimenti

Di seguito impedirà tutte le future richieste AJAX vada in cache, indipendentemente dal metodo che si utilizza jQuery ($ .get, $ .ajax, ecc.)

$.ajaxSetup({ cache: false });

di JQuery $ .get () memorizza nella cache i risultati. Invece di

$.get("myurl", myCallback)

si dovrebbe usare $ .ajax, che vi permetterà di attivare il caching off:

$.ajax({url: "myurl", success: myCallback, cache: false});

un altro modo è quello di fornire nessuna intestazione della cache dal lato server nel codice che genera la risposta alla chiamata AJAX:

response.setHeader( "Pragma", "no-cache" );
response.setHeader( "Cache-Control", "no-cache" );
response.setDateHeader( "Expires", 0 );

Tutte le risposte qui lasciano un'impronta sulla URL richiesto che apparirà nei log di accesso dei server.

Ho bisogno di una soluzione basata intestazione senza effetto secondario e ho trovato può essere ottenuto impostando le intestazioni menzionati Come controllo della pagina web caching, in tutti i browser? .

Il risultato, lavorando per Chrome, almeno, potrebbe essere:

$.ajax({
   url: url, 
   headers: {
     'Cache-Control': 'no-cache, no-store, must-revalidate', 
     'Pragma': 'no-cache', 
     'Expires': '0'
   }
});

Personalmente ritengo che il metodo stringa di query è più affidabile che cercare di impostare le intestazioni sul server - non c'è alcuna garanzia che un proxy o il browser non sarà solo nella cache comunque (alcuni browser sono peggiori di altri - per non fare nomi) .

Io di solito uso Math.random() ma non vedo nulla di sbagliato con l'utilizzo di data (non si dovrebbe fare AJAX richiede abbastanza veloce per ottenere lo stesso valore di due volte).

A seguito della documentazione: http://api.jquery.com/jquery.ajax/

è possibile utilizzare la proprietà cache con:

$.ajax({
    method: "GET",
    url: "/Home/AddProduct?",
    data: { param1: value1, param2: value2},
    cache: false,
    success: function (result) {
        // TODO
    }
});

Naturalmente tecniche "Cache-breaking" otterrà il lavoro fatto, ma questo non sarebbe accaduto in primo luogo se il server indicato per il cliente che la risposta non deve essere memorizzato nella cache. In alcuni casi è vantaggioso per le risposte di cache, a volte no. Lasciate che il server a decidere il corretto ciclo di vita dei dati. È possibile modificare in un secondo momento. Molto più facile da fare dal server che da molti luoghi diversi nel codice utente.

Naturalmente questo non aiuta se non si ha il controllo del server.

Che dire utilizzando una richiesta POST invece di un GET ...? (Che si dovrebbe in ogni caso ...)

La vera domanda è perché avete bisogno di questo per non essere memorizzate nella cache. Se non deve essere memorizzato nella cache perché cambia tutto il tempo, il server deve specificare di non memorizzare nella cache la risorsa. Se solo cambia a volte (perché una delle risorse che esso dipende può cambiare), e se il codice cliente ha un modo di conoscere su di esso, si può aggiungere un parametro fittizio per l'URL che viene calcolato da qualche hash o l'ultima data di modifica di queste risorse (che è quello che facciamo in termini di risorse di script Microsoft Ajax in modo che possano essere memorizzati nella cache per sempre, ma le nuove versioni possono ancora essere serviti come appaiono). Se il cliente non può sapere di cambiamenti, il modo corretto dovrebbe essere per il server per gestire le richieste HEAD correttamente e dire al cliente se utilizzare la versione in cache o meno. Sembra a me come l'aggiunta di un parametro casuale o raccontare dal client al mai cache è sbagliato, perché in cache è una proprietà della risorsa del server, e così dovrebbe essere deciso sul lato server. Un'altra domanda da porsi è se questa risorsa davvero essere servito attraverso GET o dovrebbe passare attraverso POST? Questa è una questione di semantica, ma ha anche implicazioni per la sicurezza (ci sono attacchi che funzionano solo se il server permette di GET). POST non sarà possibile ottenere cache.

Forse si dovrebbe guardare a $ .ajax () invece (se si utilizza jQuery, che sembra). Date un'occhiata a: http://docs.jquery.com/Ajax/jQuery.ajax #options e l'opzione "cache".

Un altro approccio sarebbe quello di guardare a come mettere in cache le cose sul lato server.

Una piccola aggiunta alle ottime risposte: Se si sta eseguendo con una soluzione di backup non Ajax per gli utenti senza javascript, si dovrà ottenere quei intestazioni lato server corretto in ogni caso. Questo non è impossibile, anche se capisco quelli che danno in su;)

Sono sicuro che c'è un'altra domanda sul SO che vi darà il set completo di intestazioni che sono appropriati. Io non sono del tutto conviced risposta miceus copre tutte le basi al 100%.

Per quelli di voi che usano l'cache possibilità di $.ajaxSetup() su Safari mobile, sembra che potrebbe essere necessario utilizzare un timestamp per i posti, dal momento che Safari mobile memorizza nella cache anche questo. Secondo la documentazione su $.ajax() (che si viene indirizzati a da <=>):

  

La cache impostazione su false funziona correttamente solo con la testa e le richieste GET. Funziona aggiungendo "_ = {timestamp}" per i parametri GET. Il parametro non è necessaria per gli altri tipi di richieste, tranne che in IE8 quando un post è fatto a un URL che è già stato richiesto da un GET.

Quindi, impostando l'opzione da solo non vi aiuterà nel caso che ho citato sopra.

Fondamentalmente basta aggiungere cache:false; in ajax dove si pensa che il contenuto cambia come il progresso su.E il luogo in cui il contenuto non cambierà ci u possibile omettere questo.In questo modo u otterrà la risposta nuova ogni volta

Ajax Caching di Internet Explorer: Che cosa hai intenzione di fare al riguardo ? suggerisce tre approcci:

  
      
  1. Aggiungi una cache busting token per la stringa di query, come? Date = [timestamp]. In jQuery e YUI si può dire loro di farlo automaticamente.
  2.   
  3. Usa POST invece di un GET
  4.   
  5. Invia un'intestazione di risposta HTTP che vieta specificamente ai browser di memorizzare nella cache che
  6.   

Ora, è facile farlo attivando / disattivando l'opzione di cache nella richiesta Ajax, proprio come questo

$(function () {
    var url = 'your url goes here';
    $('#ajaxButton').click(function (e) {
        $.ajax({
            url: url,
            data: {
                test: 'value'
            },
                cache: true, //cache enabled, false to reverse
                complete: doSomething
            });
        });
    });
    //ToDo after ajax call finishes
    function doSomething(data) {
        console.log(data);
    }
});

Se si utilizza IE 9, quindi è necessario utilizzare il seguente di fronte alla vostra definizione di classe di controllo:

[OutputCache (NoStore = true, Durata = 0, VaryByParam = "*")]

public class TestController: controller

Questo eviterà che il browser di cache.

dettagli su questo link: http: //dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/

In realtà questo ha risolto il mio problema.

Come ha detto @Athasach, secondo la documentazione jQuery, $.ajaxSetup({cache:false}) sarà non funzionare per altro che GET e richieste HEAD.

Si sta meglio l'invio di nuovo un colpo di testa da Cache-Control: no-cache server in ogni caso. Esso fornisce una separazione più pulita di preoccupazioni.

Naturalmente, questo non funziona per gli URL di servizio che non appartengono al vostro progetto. In tal caso, si potrebbe considerare proxying il terzo servizio parte dal codice del server anziché richiamarla dal codice client.

Se si utilizza Net ASP MVC, disabilitare la cache sull'azione controllore aggiungendo la seguente attributo sulla funzione punto finale: [OutputCacheAttribute (VaryByParam = "*", Durata = 0, NoStore = true)]

accodare Math.random () per la richiesta URL

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top