如何在Tomcat 7中设置Cache Control为no-cache?

4

我试图将Tomcat 7的缓存控制设置为 no-cache选项。

我尝试在我的web.xml中使用ExpiresFilter,如下所示:

<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 0 seconds</param-value>
    </init-param>
    <init-param>
    <param-name>ExpiresByType text/css</param-name>
    <param-value>access plus 0 seconds</param-value>
    </init-param>
    <init-param>
    <param-name>ExpiresByType application/javascript</param-name>
    <param-value>access plus 0 seconds</param-value>
    </init-param>

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

然而,当我读取响应头时,我得到的只是:

Cache-Control:max-age=0

而不是Cache-Control: no-cache

我该如何通过配置文件设置我的Tomcat服务器仅指定Cache-Control: no-cache


从文档中得知:要修改除max-age以外的Cache-Control指令(参见RFC 2616第14.9节),您可以使用其他servlet过滤器或Apache Httpd mod_headers模块。 - Federico Sierra
1
@FedericoSierra,你知道他们所指的其他servlet过滤器是什么吗?我在文档中没有看到任何可行的选项,难道你必须自己制作? - jgr208
1
不,您可以添加自定义servlet(https://dev59.com/bHE85IYBdhLWcg3wOw_s),或者放置一个反向代理来操作标头(例如:apache,nginx等)。 - Federico Sierra
2
@FedericoSierra 对于中高级开发人员来说,手动添加此功能并不是什么大问题,但在2017年,Tomcat没有提供这个功能还是相当奇怪的。 - Yuriy Nakonechnyy
1
@Yura 是的,我同意你的看法。 - Federico Sierra
1个回答

0
为设置“Cache-Control: no-cache”,你需要创建一个自定义过滤器。ExpiresFilter 用于根据“Content-Type”向 HTTP 响应添加“Expires”和“Cache-Control: max-age =”标头,无法帮助设置“no-cache”。
请按照以下步骤进行:
  1. 编写一个自定义过滤器以设置标头,将过滤器打包到 .jar 文件中。
  2. 将 .jar 文件放入 $CATALINA_HOME/lib 目录。
  3. 在将 jar 文件添加到$ CATALINA_HOME / lib 后,验证是否没有“ClassNotFoundException”。

    package nocache;
    
    import javax.servlet.Filter;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.ServletException;
    import java.io.IOException;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    
    public class CacheFilter implements Filter { 
    
        @Override 
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 
                             FilterChain filterChain) throws IOException, ServletException { 
    
            HttpServletResponse response = (HttpServletResponse) servletResponse; 
            response.setHeader("Cache-Control", "no-cache"); 
            filterChain.doFilter(servletRequest, response); 
        } 
    }

  1. 将以下内容添加到 $CATALINA_HOME/conf/web.xml 文件中

示例 web.xml 部署描述符片段


  <filter>
        <filter-name>CacheFilter</filter-name>
        <filter-class>nocache.CacheFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CacheFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

5. 访问应用程序并检查响应头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接