Comment faire arrêter la mise en cache du navigateur GWT nocache.js
Je suis le développement d'une application web en utilisant GWT et je vois un fou problème avec la mise en cache de la app.nocache.js
fichier dans le navigateur, même si le serveur web a envoyé une nouvelle copie du fichier!
J'utilise Eclipse pour compiler l'application, qui fonctionne en dev mode. Pour tester le mode de production, j'ai une machine virtuelle (Oracle VirtualBox) avec un Ubuntu OS invité en cours d'exécution sur mon ordinateur hôte (Windows 7). Je fais tourner le serveur web lighttpd dans la machine virtuelle. La VM est le partage de mon projet de guerre du répertoire, et le serveur web est au service de cette dir.
Je suis en utilisant google Chrome comme navigateur, mais la même chose se passe dans Firefox.
Voici le scénario:
- La page web de l'application est vide. Accorind à Chrome "Inspecter l'Élément", c'est parce qu'il est en train d'essayer d'extraction
6E89D5C912DD8F3F806083C8AA626B83.cache.html
, qui n'existe pas (404 not found
). - - Je vérifier la guerre répertoire, et bien sûr, ce fichier n'existe pas.
- La
app.nocache.js
sur le navigateur a ÉTÉ RECHARGÉ à partir du serveur web (200 OK), car le fichier sur le serveur est plus récent que le cache du navigateur. J'ai vérifié que la taille du fichier et la date pour le nouveau fichier renvoyé par le serveur sont corrects. (C'est de l'info Chrome rapports sur le serveur HTTP de la réponse) -
Cependant, si j'ouvre la
app.nocache.js
sur le navigateur, le javascript est en se référant à6E89D5C912DD8F3F806083C8AA626B83.cache.html
!!! Qui est, même si le serveur web envoyer un nouveauapp.nocache.js
, le navigateur semble avoir ignoré que et maintenu à l'aide de sa copie mise en cache! -
Goto Google->GWT Compiler dans Eclipse. Recompiler le tout.
- Vérifier dans la guerre répertoire que le
app.nocache.js
a été écrasé et a un nouveau timestamp. - Recharger la page à partir de Chrome et vérifier encore une fois que le serveur a envoyé une réponse 200 OK pour la
app.nocache.js
. - Le navigateur tente une fois de plus à charge
6E89D5C912DD8F3F806083C8AA626B83.cache.html
et échoue. Le navigateur utilise encore l'ancienne copie mise en cache deapp.nocache.js
. - Fait absolument certain dans la guerre répertoire que rien n'est en se référant à
6E89D5C912DD8F3F806083C8AA626B83.cache.html
(via find et grep)
Ce qui ne va pas? Pourquoi la mise en cache du navigateur ce nocache.js
fichier, même si le serveur est de l'envoyer une nouvelle copie?
Voici une copie de la requête HTTP/en-têtes de réponse lorsque vous cliquez sur recharger dans le navigateur. Dans cette trace, le serveur de contenu n'a pas été recompilé depuis le dernier GET (mais notez que la version en cache d'nocache.js est toujours mal!):
Request URL:http://192.168.2.4/xbts_ui/xbts_ui.nocache.js
Request Method:GET
Status Code:304 Not Modified
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:192.168.2.4
If-Modified-Since:Thu, 25 Oct 2012 17:55:26 GMT
If-None-Match:"2881105249"
Referer:http://192.168.2.4/XBTS_ui.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
Response Headersview source
Accept-Ranges:bytes
Content-Type:text/javascript
Date:Thu, 25 Oct 2012 20:27:55 GMT
ETag:"2881105249"
Last-Modified:Thu, 25 Oct 2012 17:55:26 GMT
Server:lighttpd/1.4.31
Avez-vous lu, developers.google.com/web-toolkit/doc/latest/... ?
Oui, et il semble que la chose se passe, parce que la page dit "if-Modified-since fetch est suffisant". Je peux dire à partir de Chrome Inspecter l'Élément de l'outil que le navigateur a envoyé "if-Modified-since:Thu, 25 Oct 2012 17:03:53 GMT" dans la demande, et le serveur a répondu avec "Last-Modified:Thu, 25 Oct 2012 17:55:26 GMT"
Ajout d'une requête/réponse HTTP en-tête de trace pour que cela soit plus clair pour les potentiels des aides.
Je suis penser que le problème est que le navigateur effectue une estimation sur la durée de fraîcheur de la nocache.js fichier, et de déterminer le fichier est encore "frais". C'est à partir de la lecture de la spécification RFC HTTP section 13.2.4: "Si aucun n'arrive à Expiration, Cache-Control: max-age, ou Cache-Control: s - maxage (voir l'article 14.9.3) apparaît dans la réponse, et la réponse ne comporte pas d'autres restrictions sur la mise en cache, le cache PEUT calculer une durée de fraîcheur à l'aide d'une heuristique." (à partir de w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13)
OriginalL'auteur jfritz42 | 2012-10-25
Vous devez vous connecter pour publier un commentaire.
La meilleure façon d'éviter la mise en cache du navigateur est de définir le délai d'expiration de maintenant et ajouter le max-age=0 et le must-revalidate contrôles.
C'est la configuration que j'utilise avec apache httpd
votre configuration pour lighthttpd devrait être
OriginalL'auteur Manolo Carrasco Moñino
Nous avons eu un problème similaire. Nous avons découvert que l'horodatage de l'nocache.js n'a pas été mis à jour avec gwt compiler afin de toucher le fichier sur construire. Et puis nous avons également appliqué le correctif à partir de @Manolo Carrasco Moñino. J'ai écrit un blog sur ce problème. http://programtalk.com/java/gwt-nocachejs-cached-by-browser/
Nous utilisons la version 2.7 de GWT que le commentaire souligne également.
Grande réponse. Maintenant, j'ai appris Maj+F5 est une solution temporaire pour la première fois.
OriginalL'auteur awsome
Il y a deux solutions logiques (deuxième est une version modifiée de la première)
1) Renommer votre *.fichier html qui a une référence à l' *.nocache.js pour en savoir MyProject.html pour MyProject.jsp
Maintenant rechercher l'emplacement de vous *.nocache.js script dans MyProject.html
ajouter une variable dynamique comme paramètre dans le fichier JS, ce sera assurez-vous que le contenu réel sont retournés par le serveur à chaque fois. Suivant est un exemple de
Explication: dummyParam sera d'aucune utilité, MAIS nous permettront de réaliser nos résultats escomptés va nous renvoyer 200 du code au lieu de 304
Remarque: Si vous utilisez cette technique, alors vous aurez besoin pour vous assurer que vous pointez à droite de fichiers jsp pour le chargement de votre application (Avant que ce changement vous a été chargement de votre application à l'aide des fichiers HTML).
2) Si vous ne voulez pas l'utiliser JSP solution et voulez coller avec votre fichier html, alors vous aurez besoin de java script pour ajouter dynamiquement l'unique valeur du paramètre sur le côté client lors du chargement de la nocache fichier. Je suis en supposant que ne devrait pas être une grosse affaire maintenant que vous avez donné la solution ci-dessus.
J'ai d'abord utilisé la technique avec succès, espérons que cela aidera.
OriginalL'auteur Khurram Hanif
Je ne voudrais pas compter sur cet. J'ai vu un peu de l'étrange comportement de google Chrome dev tools avec l'onglet réseau en combinaison avec la mise en cache (au moins, il n'est pas 100% transparent pour moi). En cas de doute, j'ai l'habitude de toujours consulter Firebug.
Donc probablement Chrome utilise encore l'ancienne version. Il peut avoir décidé il y a longtemps qu'il n'aura jamais de recharger la ressource. Effacer le cache devrait résoudre ce problème. Et puis assurez-vous de régler correctement le cache-têtes avant d'avoir à recharger la page, voir, par exemple,Idéal HTTP cache-têtes de contrôle pour les différents types de ressources.
OriginalL'auteur Chris Lercher
Ouvrir la page dans cognito mode juste pour get-débarrasser du problème de cache et de débloquer vous-même.
Vous avez besoin pour configurer le cache de temps comme mentionné dans d'autres commentaires.
OriginalL'auteur Vedsar Kushwaha
Après avoir vainement empêcher la mise en cache via Apache, j'ai créé un script bash que racine s'exécute toutes les minutes dans une tâche cron sur mon Linux serveur Tomcat.
OriginalL'auteur PLA