Tomcat:缓存控制

时间:2010-05-20 17:26:39

标签: java tomcat

Jetty有一个CacheControl parameter(可以指定webdefault.xml)来确定客户端的缓存行为(通过影响发送给客户端的标头)。

Tomcat有类似的选择吗? 简而言之,我想关闭tomcat服务器和/或特定webapp提供的所有页面的缓存?

更新

请注意,我不是指服务器端缓存。我希望服务器告诉所有客户端(浏览器)不要使用自己的缓存并始终从服务器获取内容。我想一次为所有资源做这件事,包括静态资源(.css,.js等)。

6 个答案:

答案 0 :(得分:39)

由于Tomcat 7有一个容器提供的expires过滤器可能有所帮助。参见:

  

ExpiresFilter是Apache mod_expires的Java Servlet API端口。此过滤器控制服务器响应中Expires HTTP标头和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>

答案 1 :(得分:33)

与上述帖子类似,但该代码存在一些问题。这将禁用所有浏览器缓存:

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

}

然后按照Stu Thompson's answer

中的说明在web.xml中进行映射

答案 2 :(得分:14)

我不相信有这样的配置。但是,编写一个过滤器来基于每个webapp设置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 {}
}

您可以将此代码段放入您的webapp的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>

答案 3 :(得分:1)

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" />

答案 4 :(得分:0)

可能是您正在寻找的:

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中的应用程序缓存文件夹。

答案 5 :(得分:0)

我所知道的唯一参数是disableProxyCaching元素<Valve>。请参阅here