Tomcat:缓存控制

Ita*_*man 43 java tomcat

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

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

更新

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

Jac*_*ack 40

由于Tomcat 7有一个容器提供的expires过滤器可能有所帮助.看到:

ExpiresFilter是Apache mod_expires的Java Servlet API端口.此过滤器控制ExpiresHTTP标头的设置和服务器响应中HTTP标头的max-age指令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>
Run Code Online (Sandbox Code Playgroud)

  • 我不这么认为.从文档:`要修改max-age以外的Cache-Control指令(参见RFC 2616第14.9节),您可以使用其他servlet过滤器或Apache Httpd mod_headers模块. (4认同)
  • 可以使用ExpiresFilter将缓存控制同时设置为"no-cache"和"no-store"吗?如果是,您如何在上面的代码中实现它?这将是很好的帮助. (2认同)

whi*_*tey 37

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

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

}
Run Code Online (Sandbox Code Playgroud)

然后按照Stu Thompson的回答中的描述在web.xml中进行映射.


Stu*_*son 16

我不相信有这样的配置.但是,编写一个过滤器来基于每个webapp设置Cache-Control标头应该不是很大的努力.例如:

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 {}
}
Run Code Online (Sandbox Code Playgroud)

并且您将此代码段放入您的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>
Run Code Online (Sandbox Code Playgroud)