response.setDateHeader () - кэширование не работает - PullRequest
4 голосов
/ 10 марта 2011

Я хочу, чтобы файлы .png на моей веб-странице кэшировались. Я добавил следующую запись в web.xml

 <filter>  
    <filter-name>ContentFilter</filter-name>  
    <filter-class>filters.ContentFilter</filter-class>  
   <init-param>  
       <description>Add an Expires Header</description>  
       <param-name>expiryDate</param-name>  
       <param-value>Fri, 30 Apr 2021 20:00:00 GMT</param-value>  
   </init-param>  
   </filter>
<filter-mapping>  
   <filter-name>ContentFilter</filter-name>  
  <url-pattern>*.png</url-pattern>  
</filter-mapping>

Установка значения поля expiryDate следующим образом в init ()

String expiryDateStr = filterConfig.getInitParameter("expiryDate");
    SimpleDateFormat format = new SimpleDateFormat(
            "EEE, d MMM yyyy HH:mm:ss Z");
    try {
        Date d = format.parse(expiryDateStr);
        expiryDate = d.getTime();
    } catch (ParseException e) {
        logger.error(e.getMessage(), e);
    }

doFilter ():

public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain filChain) throws IOException, ServletException {
    logger.debug("doFilter()");
    logger.info(((HttpServletRequest)req).getRequestURL().toString());
    filChain.doFilter(req, res);
    if (res instanceof HttpServletResponse) {
        HttpServletResponse response = (HttpServletResponse) res;
        logger.info(((HttpServletRequest)req).getRequestURL().toString());
        response.setDateHeader("Expires", expiryDate); 
    }
}

Моя проблема заключается в том, что всякий раз, когда я обновляю веб-страницу в браузере, клиент продолжает запрашивать файлы .png. Думаю, мой фильтр не работает. Это правильная конфигурация?

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Дата истечения срока действия не должна быть более одного года в будущем.См. Раздел 14.21 Срок действия истекает в http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Чтобы пометить ответ как «никогда не истекает», сервер отправителя отправляет дату истечения срока действия приблизительно через один год с момента отправки ответа.Серверы HTTP / 1.1 НЕ ДОЛЖНЫ отправлять даты окончания срока действия более одного года в будущем.

2 голосов
/ 10 марта 2011

Глядя на ваш код, вероятный виновник в том, что вы устанавливаете заголовок ответа после запроса, обработанного сервлетом.Слишком поздно добавлять заголовок в точке, данные ответа уже отправлены.

Переместите response.setDateHeader до filChain.doFilter, и заголовок должен быть отправлен.

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

Попробуйте использовать инструмент анализа заголовка HTTP (например, отличныйПлагин " Live HTTP Headers " для Firefox), чтобы увидеть, что происходит на самом деле.

...