кэширование изображений, врученных сервлетом

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

10
задан Bozho 20 May 2010 в 10:15
поделиться

4 ответа

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

-9
ответ дан 3 December 2019 в 20:03
поделиться

Сервлет по умолчанию, обслуживающий статический контент в контейнерах, таких как 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>
23
ответ дан 3 December 2019 в 20:03
поделиться

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

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

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

(это в Фильтре , который обрабатывает *. Jpg шаблон, например)

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

2
ответ дан 3 December 2019 в 20:03
поделиться

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

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

3
ответ дан 3 December 2019 в 20:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: