AJAX
Caching
Børre Stenseth
Moduler>AJAX>Generelt>Caching

Caching

Hva
Hvis nettelseren cacher en URL

Nettlesere lagrer ofte en vevside lokalt på din maskin slik at den er raskt tilgjengelig hvis du vil ha den opp igjen. Denne strategien (caching) er bra med tanke på rask tilgang til en side, men den er ikke så bra dersom siden er endret siden sist. De fleste nettlesere har muligheter for å stille inn hvordan denne strategien skal gjennomføres. F.eks. kan du tømme cachen når du ønsker, eller du kan gi beskjed om at den skal tømmes ved jevne mellomrom eller når nettleseren avslutter eller når et dokument i cachen har nådd en viss alder.

Når vi lager AJAX-løsninger er caching av og til et problem. Internett explorer har automatisk caching skrudd på. Konsekvensen er at dersom du gjør en XMLHttprequest med den samme adressen flere ganger, får du den cachede versjonen. Du får det samme som du fikk sist. Det er ikke alltid vi ønsker dette. Det kan hende at dataene vi spør etter er endret av andre programmer, eller det kan hende vi har en eller annen autentiseringsstrategi som krever flere oppslag eller at vi overlater til serverskriptet å lage et tilfeldig eller tidsavhengig datasett som retur.

Vi kan endre IE's cahcing strategi og vi kan tømme cachen for å teste at løsningen vår fungerer, men dersom løsningen skal fungere for brukere som ikke er interesserte i å sette seg inn våre cachingproblemer, så må vi finne på noe annet.

Random parameter

En enkel løsning er å sende med en ekstra "tilfeldig" parameter i forespørselen.

http://www.it.hiof.no/~borres/cgi-bin/dagenstext.py?language=latin

er forskejllig fra

http://www.it.hiof.no/~borres/cgi-bin/dagenstext.py?language=latin&tull=x

selv om "tull=x" er meningsløs både for vevsiden som sender forespørselen og for skriptet som skal betjene den.

En funksjon som generalisere en slik løsning, med å lage en ny, unik, dummyparameter kan være f.eks. slik :

function uncache(url){
	var d = new Date();
	var time = d.getTime();
	return url + ‘&time=’+time;
}

"time" trenger ikke ha noen mening for kommuniksajonen mellom nettleser og tjener, men har den egenskapen at den blir forskjellig for hver gang vi lager den. Et alternativ kan være slik:

function uncache(url){
	return url + ‘&tull=’+Math.random()
}

Siden random-funksjonen i Javascript tar utgangspunkt (seed) i tidsfunksjonen, vil dette for vårt formål gjøre samme jobben.

Du kan teste herhttp://www.it.hiof.no/~borres/dw/ajaxmore/caching/nocache1.html

Styring av caching

Hvis den kilden vi etterspør er et skript, kan vi sende tilbake en header som kontrollerer hvordan nettleseren skal forholde seg til caching. Hvis vi har et Pythonskript kan vi skrive tilbake:

print "Cache-Control: no-cache, must-revalidate\nContent-type: text/html\n\n"

alt som en del av headeren, som det framgår.

Test her http://www.it.hiof.no/~borres/dw/ajaxmore/caching/nocache2.html

Merk: at det er noen problemer med å unngå caching i MSIE når vi bruker GET. Et alternativ er å bruke POST. POST cacher ikke. Det er også mulig å bruke andre Cache-Control- verdier, som Max-Age. Se HTTP-dokumentasjon for å studere alternativene.

Test POST her http://www.it.hiof.no/~borres/dw/ajaxmore/caching/nocache3.html
Referanser
  1. Microsoft og cachingMicrosoftsupport.microsoft.com/kb/22206414-03-2010
  1. W3C om HTTPW3Cwww.w3.org/Protocols/14-03-2010
Vedlikehold

Børre Stenseth, november 2006
med hjelp av detektivarbeid på "Cache-Control" fra student Thomas Karlsen.

(Velkommen) Moduler>AJAX>Generelt>Caching (Dataformater)