2010-05-20 20 views
40

Jetty tiene un CacheControl parameter (se puede especificar webdefault.xml) que determina el comportamiento de caché de los clientes (afectando los encabezados enviados a los clientes).Tomcat: Cache-Control

¿Tomcat tiene una opción similar? En resumen, ¿quiero desactivar el almacenamiento en caché de todas las páginas entregadas por un servidor tomcat y/o por una aplicación web específica?

actualización

Tenga en cuenta que no me refiero a la caché del servidor. Quiero que el servidor le diga a todos los clientes (navegadores) que no usen su propio caché y que siempre busquen el contenido del servidor. Quiero hacerlo para todos los recursos, incluidos los recursos estáticos (.css, .js, etc.) a la vez.

Respuesta

31

Similar a la publicación anterior, excepto que hay algunos problemas con ese código. Esto desactivará el almacenamiento en caché del navegador:

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); 
    } 

} 

y asigne en web.xml como se describe en Stu Thompson's answer.

+0

Esto me solucionó el problema. ¡Safari 6 (iOS) almacena en caché las solicitudes de POST y esto me estaba matando! ¡Gracias! – cbmeeks

0

puede ser esto lo que busca:

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. 

también elimine la carpeta caché de la aplicación en/trabajo/Catalina/localhost después de cambiar esta bandera.

+0

Gracias, pero esto no me ayuda. El parámetro al que se refiere afecta al almacenamiento en caché del lado del servidor. Quiero que el servidor le diga a todos los clientes (navegadores) que no usen su propio caché y que siempre busquen el contenido del servidor. Y, quiero hacerlo para todos los recursos a la vez. –

+0

ah ok..afaik implementar un filtro es una forma de hacerlo. – Inv3r53

+0

Parece que no hay control de caché incorporado en Tomcat. – Inv3r53

13

No creo que haya una configuración para hacer esto. Pero no debería ser un gran esfuerzo escribir un filtro para establecer el encabezado Cache-Control en base a cada aplicación web. Ej .:

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 {} 
} 

Y tendría que incluir este fragmento en el archivo de su aplicación web 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> 
+0

¿Esto se aplicará solo a servlets, o también a archivos estáticos, por ejemplo css/images, que son servidos por Tomcat? –

+0

@ClickUpvote Cualquier cosa en la aplicación web: servlets y archivos estáticos –

0

El único parámetro que conozco es disableProxyCaching en <Valve> elementos. Ver here.

1

En realidad, hay varios elementos en la configuración de Tomcat que afectan directamente a esto. Consulte la documentación en http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html por ejemplo.

Atlassian recomienda las dos afirmaciones siguientes para habilitar la caché del navegador para que Microsoft Internet Explorer será capaz de descargar correctamente y ver documentos adjuntos:

<Valve className="org.apache.catalina.authenticator.FormAuthenticator" securePagesWithPragma="false" /> 
<Valve className="org.apache.catalina.authenticator.NonLoginAuthenticator" securePagesWithPragma="false" /> 
37

Desde Tomcat 7 hay un contenedor provisto expira filtro eso puede ayudar. Ver:

ExpiresFilter es un puerto API Java Servlet de Apache mod_expires.Este filtro controla la configuración del encabezado HTTP Expires y la directiva max-age del encabezado HTTP Cache-Control en las respuestas del servidor. La fecha de caducidad puede establecerse en relación con la hora en que se modificó por última vez el archivo fuente o en el momento del acceso del cliente.

<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> 
+2

¿Se puede usar ExpiresFilter para establecer el control de caché en "no-cache" y "no-store" al mismo tiempo? En caso afirmativo, ¿cómo lo logras en el código anterior? Esto sería de gran ayuda. –

+3

No lo creo. De la documentación: 'Para modificar las directivas de control de caché que no sean max-age (vea RFC 2616 sección 14.9), puede usar otros filtros de servlets o módulo mod_headers de Apache Httpd. – Jack

+0

Transmití el ExpiresFilter a Tomcat 6. Consulte https://github.com/bnegrao/ExpiresFilter –