Включение кеширования браузера через 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="..."/>), похоже, все время попадает на сервер.

[РЕДАКТИРОВАТЬ] После еще нескольких испытаний, доступ к моему изображению через адресную строку не работает все время. Но кажется, что кеширование работает чаще, чем. Что касается того, действительно ли это, я не уверен.

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

Есть идеи почему?

Спасибо

2 ответа

Решение

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

Полный список заголовков и пояснений приведен в спецификации HTTP 1.1. См. Кэширование в HTTP (13) и Определения полей заголовка (14)

Плагин Firebug - это хороший способ проверить заголовки запросов и ответов с помощью Firefox.

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

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

Другие вопросы по тегам