2009-07-07 6 views
1

Доброго дня,Включение кэширования браузера с помощью Java

Я использую CacheFilter фильтровать определенный путь к моему серверу (который выводит поток изображения в поток ответа). И я настроил его в своем web.xml следующим образом:

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

Используя мой Firefox, если доступ к моему URL через адресную строку, она попадает на сервер в первый раз, но использует кэш во время последующих вызовов. Однако, если URL-адрес находится внутри моей страницы (т. Е. <img src="..."/>), он, кажется, попадает на сервер все время.

[EDIT] После нескольких дополнительных испытаний доступ к моему изображению через адресную строку не работает все время. Но кеширование, похоже, работает с ним чаще, чем. Что касается этого, я не уверен.

Дополнительная информация: my path is something like/my/path? Then = some & query = strings. Обратите внимание, что у него нет расширения (т. Е. Gif, png, jpeg), но его mimetype установлен правильно (image/gif, image/png, image/jpeg). Я не уверен, что отсутствие расширения или наличие строк запроса оказывают какое-либо влияние. (Кроме того, еще одно примечание. Хотя мой url имеет строки запроса, я использую ту же самую строку uri + query снова и снова с моими тестами).

Любые идеи, почему?

Благодаря

ответ

1

Вы хотите особенно искать заголовок Cache-Control в своем запросе. Если в запросе указано что-то вроде Cache-Control: no-cache или Cache-Control: max-age = 0, то кэши не могут обслуживать кешированную копию. Или, если ответ имеет заголовок Expires, который слишком близок во времени, тогда его нельзя долго кэшировать.

Полный список заголовков и пояснений содержится в спецификации HTTP 1.1. См. Caching in HTTP (13) и Header Field Definitions (14)

Firebug plug-in - один из лучших способов проверить заголовки запросов и ответов с использованием Firefox.

Также следите за тем, как вы используете Firefox. Нажатие кнопки обновления эквивалентно высказыванию Cache-Control: no-cache - он говорит, что вам нужна самая свежая копия, которая вернет вас обратно на ваш исходный веб-сервер.

+0

Спасибо, В настоящее время я устанавливаю Cache-Control и Expires в заголовках ответов. Должен ли я установить Cache-Control в заголовках запроса? Re: firefox: Wdym? Я тестирую только кнопку «Обновить» или «F5», а не Shift + RefreshButton или Ctrl + F5. ... Вы хотите сказать, что firefox RefreshButton - это жесткое обновление? Спасибо, –

+0

@Franz: Если ваши ответные заголовки разрешают кешировать достаточно долгое время, это правильно. Заголовки запросов Firefox можно увидеть, если вы используете Firebug или другой плагин для веб-разработки; эта информация должна быть действительно полезной. Семантика F5 и Ctrl-F5: http://support.mozilla.com/tiki-view_forum_thread.php?style_mode=inproduct&locale=en-US&comments_parentId=333668&forumId=1 Также попробуйте ввести свой URL-адрес, затем введите другой URL-адрес, затем снова введите свой первый URL-адрес, избегая кнопок обновления и возврата/перемотки вперед. –

1

Я расследую запрос HTTP посылается - в частности, заголовки HTTP для отправки запроса этого изображения. Вы можете использовать Firefox plugin и/или проверить заголовки на конце сервлета (в объекте HttpServletRequest)

+0

На что я должен быть направлен? Есть ли какие-то ошибки? –

+0

HttpFox (https://addons.mozilla.org/en-US/firefox/addon/6647) может быть еще лучше для просмотра заголовков. Посмотрите, что отличается от типа URL-типа, который работает, и выборки IMG SRC, которая этого не делает. Что-то, на что нужно обратить внимание: когда вы нажмете «перезагрузить», firefox считает, что запрос на повторную проверку его локальной копии, по крайней мере, с запросом «if-modified-since», который ваш сервлет может просто рассматривать как новый get. Кроме того: вы можете просматривать записи кэша браузера w/expire times с «about: cache» в строке местоположения. – gojomo

+0

Я бы проверял все заголовки, чтобы убедиться, что они того, чего вы ожидаете. Я не знаю, как работает ваш уровень кеширования, и, следовательно, как он определяет, является ли запрос для чего-то нового или для ранее запрошенного объекта. –