кэширование изображений, обслуживаемых сервлетом - PullRequest
10 голосов
/ 20 мая 2010

Я подаю изображения из моего сервлета. Тип содержимого ответа: image / jpeg. Я обнаружил, что изображения, запрошенные из моего сервлета, не кэшируются. Как мне получить их кешировать, как обычно запросы к файлам изображения? Я попытался установить Cache-Control: общедоступный, но безрезультатно.

Ответы [ 4 ]

23 голосов
/ 20 мая 2010

Сервлет по умолчанию, обслуживающий статическое содержимое в контейнерах, таких как Tomcat, не устанавливает заголовки управления кэшем. Вам не нужно писать сервлет только для этого. Просто создайте фильтр, подобный этому,

public void doFilter(ServletRequest request,
        ServletResponse response,
        FilterChain chain) 
    throws IOException, ServletException {

    long expiry = new Date().getTime() + cacheAge*1000;

    HttpServletResponse httpResponse = (HttpServletResponse)response;
    httpResponse.setDateHeader("Expires", expiry);
    httpResponse.setHeader("Cache-Control", "max-age="+ cacheAge);

    chain.doFilter(request, response);

 }

Всякий раз, когда вы хотите добавить элемент управления кэшем, просто добавьте фильтр к ресурсам в web.xml. Например,

<filter>
    <filter-name>CacheControl</filter-name>
    <filter-class>filters.CacheControlFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>CacheControl</filter-name>
    <url-pattern>/images/*</url-pattern>
</filter-mapping>
3 голосов
/ 20 мая 2010

Вам необходимо отправить заголовки ETag, Last-Modified и Expires вдоль ответа. ETag представляет уникальный идентификатор файла (обычно составляется на основе комбинации имени файла, размера файла и последней измененной временной метки). Last-Modified представляет последнюю измененную временную метку файла. Заголовок Expires указывает, как долго клиент может хранить файл в кэше. Если срок действия кэша истек и доступны ETag или Last-Modified, клиент отправит запрос HEAD, чтобы проверить, нужно ли обновить файл. Если нет, то Expires просто будет снова отложено соответственно.

Вы можете найти здесь пример сервлета, который обрабатывает все это (и загружает резюме и автоматический GZIP): FileServlet с поддержкой резюме и GZIP

2 голосов
/ 20 мая 2010

Например, если вы хотите кэшировать их на 1 месяц:

Calendar inOneMonth = Calendar.getInstance();
inOneMonth.add(Calendar.MONTH, 1);

response.setDateHeader("Expires", inOneMonth.getTimeInMillis());

(например, Filter, который обрабатывает шаблон *.jpg)

Но изображения должны кэшироваться по умолчанию - проверьте фильтры и конфигурации, чтобы убедиться, что что-то неправильно устанавливает параметры кэша.

0 голосов
/ 20 мая 2010

ОК. Похоже, что поля заголовка по умолчанию должны включать кэширование. Я нашел решение на другом форуме. Очевидно, вам нужно явно указать длину содержимого в ответе. Интересно, почему, хотя. Я думал, что HttpServletResponse сделает это для нас. В любом случае, это сработало как шарм, и изображение хорошо кэшируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...