2013-06-25 10 views
8

Ich habe eine Webanwendung, die den Browser AJAX-Anfragen-Ergebnis für lange Zeit zwischenspeichern kann. Ich habe herausgefunden, wie man eine Anfrage stellt, die den Cache komplett umgeht, wenn wahrscheinliche Modifikationen entdeckt werden. Aber ich möchte den Benutzer eine Datenaktualisierung auslösen lassen.Erzwingen AJAX-Anforderung, Cache mit Server erneut zu validieren, ohne vollständig neu zu laden

In diesem Szenario möchte ich den Browser mit dem Server überprüfen, wenn der Cache blockiert ist, aber verwenden Sie es, wenn es nicht ist (dh, wenn der Server mit einem 304-Code antwortet). Das Ziel ist es, die Ladezeit zu schonen, da die Daten riesig sind.

Der Server enthält die folgenden Header in allen Antworten:

Cache-Control: private, max-age=604800 
Last-Modified: ... # actual last modification date 

ich das im Cache gespeicherte Objekt vollständig in Chrome platzen verwaltet (nicht anderen Browsern noch nicht getestet), indem Sie die folgenden HTTP-Header in der Anfrage mit:

Cache-Control: max-age=0 
If-Last-Modified: Tue, 01 Jan 1970 01:00:00 +0100 

Die Linie If-Last-Modified ist diejenige, die wirklich eine Wirkung hat. Chrome scheint den Header Cache-Control in der Anfrage zu ignorieren.

Ich habe auch festgestellt, dass die Verwendung von Cache-Control: must-revalidate in der Server-Antwort zwingt den Browser, seinen Cache mit dem Server für jeweils Anfrage zu validieren.

Aber gibt es eine Möglichkeit, nur für eine präzise Anfrage revalidieren, auf der Client-Seite entschieden?

Beachten Sie, dass ich nicht speziell mit HTTP-Headern daran gebunden bin, also ist jede andere Methode, die ich nicht kennen würde, willkommen!

+0

Verwenden Sie also nur 'If-Last-Modified' mit dem letzten' Last-Modified' Antwortheader. –

+0

Ich habe das versucht, und ich bekomme die 304 vom Server, aber der Browser verwendet nicht den Cache, um die Antwort zu füllen, also ist es leer im Code ... Ich nehme an, der Browser zeigt kein Interesse in einem 'If-Last-Modified'-Header hat es sich nicht selbst hinzugefügt. – rixo

+0

Wenn Sie dann die letzte Antwort selbst zwischenspeichern, müssen Sie dies manuell tun, d. H. Wenn die Antwort 200 ist, überschreiben Sie Ihren Cache, und wenn die Antwort 304 ist, verwenden Sie die alte Kopie. Es kann leicht abstrahiert werden. –

Antwort

2

Sie können einen URL-Parameter hinzufügen, der den Wert auf der Grundlage der Zeit ermittelt, um den Cache für nur eine präzise Anforderung zu bereinigen.

$.ajax({ 
    url:"/questions?nocache="+Date.now(), 
    "success":function(data){ 
     console.log(data); 
    } 
}); 
+1

Ich möchte den Cache nicht vollständig umgehen, ich möchte, dass der Browser den Server fragt, ob sein Cache noch gültig ist, und ihn verwenden, wenn er eine 304 erhält. Der Cache sollte nur gelöscht werden, wenn der Server 200 antwortet. – rixo

Verwandte Themen