Tomcat: Cache-Control - PullRequest
       9

Tomcat: Cache-Control

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

Jetty имеет параметр CacheControl (можно указать webdefault.xml), который определяет поведение клиентов при кэшировании (влияя на заголовки, отправляемые клиентам).

Есть ли у Tomcat аналогичная опция? Короче говоря, я хочу отключить кэширование всех страниц, предоставляемых сервером Tomcat и / или конкретным веб-приложением?

Обновление

Обратите внимание, что я не имею в виду кэширование на стороне сервера. Я хочу, чтобы сервер сказал всем клиентам (браузерам) не использовать свой собственный кеш и всегда получать содержимое с сервера. Я хочу сделать это для всех ресурсов, включая статические ресурсы (.css, .js и т. Д.) Одновременно.

Ответы [ 6 ]

39 голосов
/ 10 марта 2013

Начиная с Tomcat 7 имеется контейнер, срок действия фильтра которого может помочь. См:

ExpiresFilter - это порт API сервлета Java Apache mod_expires . Этот фильтр управляет настройкой заголовка HTTP Expires и директивы max-age заголовка HTTP Cache-Control в ответах сервера. Дата истечения срока может быть установлена ​​относительно времени последнего изменения исходного файла или времени доступа клиента.

<filter>
    <filter-name>ExpiresFilter</filter-name>
    <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
    <init-param>
        <param-name>ExpiresByType image</param-name>
        <param-value>access plus 10 days</param-value>
    </init-param>
    <init-param>
        <param-name>ExpiresByType text/css</param-name>
        <param-value>access plus 10 hours</param-value>
    </init-param>
    <init-param>
        <param-name>ExpiresByType application/javascript</param-name>
        <param-value>access plus 10 minutes</param-value>
    </init-param>
    <!-- Let everything else expire immediately -->
    <init-param>
        <param-name>ExpiresDefault</param-name>
        <param-value>access plus 0 seconds</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>ExpiresFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
34 голосов
/ 15 февраля 2011

Аналогично посту выше, за исключением некоторых проблем с этим кодом. Это отключит все кэширование браузера:

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;

public class CacheControlFilter implements Filter {

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

        HttpServletResponse resp = (HttpServletResponse) response;
        resp.setHeader("Expires", "Tue, 03 Jul 2001 06:00:00 GMT");
        resp.setDateHeader("Last-Modified", new Date().getTime());
        resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0");
        resp.setHeader("Pragma", "no-cache");

        chain.doFilter(request, response);
    }

}

, а затем сопоставьте в web.xml, как описано в ответ Стю Томпсона .

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

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

public class test implements Filter {

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

            chain.doFilter(request, response);
            ((StatusResponse)response).setHeader("Cache-Control",
                    "max-age=0, private, must-revalidate");
        }

        public void destroy() {}

        public void init(FilterConfig arg0) throws ServletException {}
}

И вы поместите этот фрагмент в файл web.xml вашего веб-приложения.

<filter>
    <filter-name>SetCacheControl</filter-name>
    <filter-class>ch.dietpizza.cacheControlFilter</filter-class>
</filter>                       
<filter-mapping>
    <filter-name>SetCacheControl</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
1 голос
/ 08 мая 2012

На самом деле в конфигурации Tomcat есть несколько элементов, которые напрямую влияют на это. См. Документацию на http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html, например.

Atlassian рекомендует следующие два утверждения для ВКЛЮЧЕНИЯ кеширования на стороне браузера, чтобы Microsoft Internet Explorer мог правильно загружать и просматривать вложенные документы:

<Valve className="org.apache.catalina.authenticator.FormAuthenticator" securePagesWithPragma="false" />
<Valve className="org.apache.catalina.authenticator.NonLoginAuthenticator" securePagesWithPragma="false" />
0 голосов
/ 24 мая 2010

Единственный известный мне параметр - disableProxyCaching для <Valve> элементов. Смотри здесь .

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

может быть это то, что вы ищете:

http://tomcat.apache.org/tomcat-6.0-doc/config/context.html#Context%20Parameters

    cachingAllowed : If the value of this flag is true, the cache for static

 resources will be used. If not specified, the default value of the flag is true.

Также удалите папку кэша приложения в / work / Catalina / localhost после изменения этого флага.

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