Caching
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.
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.
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.