Я подаю изображения от своего сервлета. Тип контента ответа является image/jpeg. Я нахожу, что изображения, которые требуют от моего сервлета, не кэшируются. Как я заставляю их кэшироваться как запросы изображения файла, обычно? Я попробовал установку Cache-Control: общественность, но напрасно.
Хорошо... похоже, что поля заголовков по умолчанию должны включать кэширование. Я нашел решение на другом форуме. По-видимому, вам нужно явно установить content-length в ответе. Интересно, почему. Я думал, что HttpServletResponse сделает это за нас. В любом случае, это сработало как шарм, и изображение отлично кэшируется.
Сервлет по умолчанию, обслуживающий статический контент в контейнерах, таких как 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>
Например, если вы хотите кэшировать их на 1 месяц:
Calendar inOneMonth = Calendar.getInstance();
inOneMonth.add(Calendar.MONTH, 1);
response.setDateHeader("Expires", inOneMonth.getTimeInMillis());
(это в Фильтре
, который обрабатывает *. Jpg
шаблон, например)
Но изображения должны кэшироваться по умолчанию - проверьте свои фильтры и конфигурации, чтобы убедиться, что что-то не устанавливает параметры кеширования неправильно.
Вам необходимо отправить ETag
, Last-Modified
и Expires
заголовки в ответе. ETag
представляет собой уникальный идентификатор файла (обычно составленный на основе комбинации имени файла, размера файла и отметки времени последнего изменения). Last-Modified
представляет собой метку времени последнего изменения файла. Заголовок Expires
указывает, как долго клиенту разрешено хранить файл в кэше. Если срок действия кеша истек и доступен ETag
или Last-Modified
, то клиент отправит запрос HEAD
, чтобы проверить, должен ли файл быть возобновлено. Если нет, то Expires
будет соответственно отложено снова.
Вы можете найти здесь пример сервлета, который обрабатывает все это (и загружает резюме и автоматический GZIP): FileServlet, поддерживающий резюме и GZIP