AJAX, XMLHttp et le cache !!
16 mars 2006En developpant le projet dotnet (lire mon post du 26/02/06) en XHTML/JS à la sauce AJAX, je me suis heurté à un problème de cache !
En effet que l’on utilise l’objet XMLHttpRequest pour Firefox & Co ou l’objet de IE (Microsoft.XMLHTTP), on appelle la mĂ©thode open et send pour rĂ©cuperer un fichier XML par le code :
1 2 3 | objXMLHTTP.open("GET", "http://localhost/demo_ajax/eleves.xml", false); objXMLHTTP.send(null); objXML = objXMLHTTP.responseXML; |
Le problème de cela, c’est qu’une fois le XML tĂ©lĂ©chargĂ©, le navigateur le met dans son cache ! Si par la suite vous modifiez votre XML, votre application web ne tiendra pas compte des modifications mĂŞme en rechargant la page (F5) ce qui est un peu embĂŞtant !
Pour remedier à cela, une technique consiste a appeler la methode setRequestHeader pour définir le Cache-Control à no-cache par le code :
1 | objXMLHTTP.setRequestHeader("Cache-Control","no-cache"); |
Le problème, c’est que ca marche PAS
Enfin du moins sur pas mon Firefox…. ^^
La technique que j’ai implĂ©mentĂ© est de passer des parametres uniques dans l’URL de notre fichier XML !
Je m’explique, les adresses URL http://monserveur/monfichier.xml?id=1 et http://monserveur/monfichier.xml?id=2 retourne tous les deux le mĂŞme fichier Ă savoir monfichier.xml, ici les parametres n’ont aucune influence cotĂ© serveur mais pour le cotĂ© client, le navigateur (IE,FF,..) pense que ce sont 2 fichiers differentes car les URL ne sont pas identique et donc on contourne le problème de cache !!
Personnellement, j’utilise pour cela la fonction getTime() de l’objet Javascript Date qui retourne le nombre de millisecondes depuis le 1er Janvier 1970 ! On obtient bien un parametre unique a moins de dĂ©regler son horloge au millieme de seconde près ^^.
Le code final:
1 2 | objXMLHTTP.open("GET", "http://localhost/mon_app/mon_fichier.xml?ms=" + new Date().getTime(), false); objXMLHTTP.setRequestHeader("Cache-Control","no-cache"); objXMLHTTP.send(null); objXML = objXMLHTTP.responseXML; |
Elle est pas belle vie ?? ^^
Nom: Sébastien Warin

#1 MonsieurN
8 avril 2006 Ă 21:51
Salut, C’est Nicolas d’IS1 Valenciennes (celui qui t’a rĂ©solu un problème de positionnement CSS un jour dans le train).
Je me demande pourquoi tu utilises une URL absolue pour faire ta requĂŞte. Le fichier XML se trouvera sur un autre serveur que l’application web ? Parce que dans le cas contraire, tu n’as qu’Ă mettre ‘mon_fichier.xml’ pour l’URL et en plus tu n’auras pas ce problème de cache.
#2 OrochimaruSama
11 septembre 2006 Ă 14:26
Mici SeBeuh
pour cette superbe astuce :p
Et je tiens Ă dire (en tout cas pour moi) que mĂŞme en utilisant l’URL relative le problème de cache persistait.
Donc encore une fois : Elle est trés trés bien ton astuce
(Si kelk1 dotre trouve mieux, chui preneur héhé :p)
#3 Raph
20 septembre 2006 Ă 15:21
MERCI BEAUCOUP !!!
ca commencait Ă m’agacer ce problème de cache sur les fichiers xml..
#4 Rdmoshpit
9 janvier 2008 Ă 16:07
C’est beau ! merci beaucoup, c’est juste parfait !
#5 david
18 novembre 2008 Ă 13:28
super astuce! ca m’a sauvĂ©!