2009-07-07 11 views
1

Bonjour,Mise en cache du navigateur via java

J'utilise CacheFilter pour filtrer un certain chemin vers mon serveur (qui délivre un flux d'images dans le flux de réponse). Et je l'ai configuré dans mon web.xml comme suit:

<filter> 
    <filter-name>imagesCache</filter-name> 
    <filter-class>com.samaxes.cachefilter.presentation.CacheFilter</filter-class> 
    <init-param> 
     <param-name>privacy</param-name> 
     <param-value>public</param-value> 
    </init-param> 
    <init-param> 
     <param-name>expirationTime</param-name> 
     <param-value>2592000</param-value> 
    </init-param> 
</filter> 

... 
<filter-mapping> 
    <filter-name>imagesCache</filter-name> 
    <url-pattern>/my/path/*</url-pattern> 
</filter-mapping> 

En utilisant mon firefox, si j'accéder à mon URL via la barre d'adresse, il frappe le serveur la première fois, mais utilise le cache lors d'appels suivant. Toutefois, si l'URL est à l'intérieur de ma page (c'est-à-dire <img src="..."/>), il semble frapper le serveur tout le temps. [EDIT] Après quelques tests supplémentaires, l'accès à mon image via la barre d'adresse ne fonctionne pas tout le temps. Mais la mise en cache semble fonctionner plus souvent avec. Quant à savoir si vraiment, je ne suis pas sûr.

Informations supplémentaires: mon chemin est quelque chose comme/mon/chemin? Then = certains & query = chaînes. Notez qu'il n'a pas d'extension (c'est-à-dire gif, png, jpeg) mais que son type mime est correctement défini (image/gif, image/png, image/jpeg). Je ne suis pas sûr si le manque d'extension ou la présence des chaînes de requête ont un impact. (En outre, une autre note, bien que mon URL ait des chaînes de requête, j'utilise la même chaîne de requête uri + encore et encore avec mes tests).

Des idées pourquoi?

Merci

Répondre

1

Vous souhaitez particulièrement rechercher tout en-tête Cache-Control dans votre demande. Si une requête indique quelque chose comme Cache-Control: no-cache ou Cache-Control: max-age = 0, alors les caches ne peuvent pas servir une copie mise en cache. Ou si la réponse a un en-tête Expires qui est trop proche dans le temps, alors il ne peut pas être mis en cache longtemps.

La liste complète des en-têtes et des explications se trouve dans la spécification HTTP 1.1. Voir Caching in HTTP (13) et Header Field Definitions (14)

Le Firebug plug-in est un bon moyen de vérifier les en-têtes de requête et de réponse en utilisant Firefox.

Regardez également comment vous utilisez Firefox. Frapper le bouton d'actualisation équivaut à dire Cache-Control: no-cache - il dit que vous voulez la copie la plus fraîche possible, qui vous ramène tout au long de votre serveur web d'origine.

+0

Merci, Actuellement, je définis les en-têtes Cache-Control et Expires dans les réponses. Devrais-je définir Cache-Control dans les en-têtes de la requête à la place? Re: firefox: Wdym? Je ne fais que tester avec le 'refresh button' ou avec 'F5' et non avec Shift + RefreshButton ou Ctrl + F5. ... Voulez-vous dire que RefreshButton de firefox est un rafraîchissement dur par lui-même? Merci, –

+0

@Franz: Si vos en-têtes de réponse permettent la mise en cache pendant suffisamment longtemps, c'est correct. Les en-têtes de demande de Firefox peuvent être vus si vous utilisez Firebug ou un autre plug-in de développement Web; cette information devrait être * vraiment * utile ici. La sémantique de F5 et Ctrl-F5 sont: http://support.mozilla.com/tiki-view_forum_thread.php?style_mode=inproduct&locale=fr&comments_parentId=333668&forumId=1 Aussi, essayez d'entrer votre URL, puis en entrant une URL différente, puis entrez à nouveau votre première URL, en évitant les boutons Actualiser et Précédent/Suivant. –

1

J'enquêter sur la requête HTTP envoyée - en particulier les en-têtes HTTP envoyés pour cette demande d'image. Vous pouvez utiliser un Firefox plugin et/ou vérifier les en-têtes à la fin de la servlet (dans l'objet HttpServletRequest)

+0

Que devrais-je être à l'affût? Y a-t-il des pièges? –

+0

HttpFox (https://addons.mozilla.org/en-US/firefox/addon/6647) peut être encore meilleur pour afficher les en-têtes. Regardez ce qui est différent entre le type d'URL qui fonctionne et l'extraction IMG SRC qui ne fonctionne pas. Quelque chose à surveiller: lorsque vous cliquez sur 'reload', firefox considère qu'une requête pour revérifier sa copie locale, avec au moins une requête 'if-modified-since' que votre servlet peut simplement traiter comme une nouvelle acquisition. En outre: vous pouvez voir les entrées de cache du navigateur w/expire fois avec 'about: cache' dans la barre d'adresse. – gojomo

+0

Je voudrais vérifier tous les en-têtes pour s'assurer qu'ils sont ce que vous attendez. Je ne sais pas comment votre couche de mise en cache fonctionne, et donc comment elle détermine si une demande est pour quelque chose de nouveau, ou pour une entité précédemment demandée. –

Questions connexes