You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Tomcat 8.5升级到9后静态3D文件缓存异常,如何关闭缓存?

解决Tomcat 9中静态3D文件缓存导致Chrome/Edge无法加载的问题

针对你遇到的Tomcat 9切换后3D静态文件在Chrome/Edge缓存失效的问题,以下是几个针对性的解决方案:

1. 禁用PreResources目录的缓存

你在conf/Catalina/localhost下配置的PreResources需要明确禁用缓存,因为默认会继承全局缓存设置。修改该目录下的context.xml:

<Context>
  <Resources cachingAllowed="false">
    <PreResources className="org.apache.catalina.webresources.DirResourceSet"
                  base="C:\xxx\service"
                  webAppMount="/service"
                  cachingAllowed="false" />
  </Resources>
</Context>

同时确保TOMCATROUTE/conf/context.xml中的全局Resources配置保持cachingAllowed="false",避免冲突。

2. 修改全局DefaultServlet的缓存配置

Tomcat默认通过DefaultServlet处理静态资源,直接修改conf/web.xml中的该Servlet配置,强制禁用缓存:

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>cacheAllowed</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>cacheMaxSize</param-name>
        <param-value>0</param-value>
    </init-param>
    <!-- 保留原有其他init-param和配置 -->
    <load-on-startup>1</load-on-startup>
</servlet>
  • cacheAllowed="false":直接禁用DefaultServlet的缓存功能
  • cacheMaxSize="0":清空缓存容量上限,确保无缓存空间

3. 用Filter强制添加无缓存响应头

如果上述配置仍不生效,可通过自定义Filter拦截/service路径的请求,强制返回无缓存响应头:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(urlPatterns = "/service/*")
public class NoCacheFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        // 设置完整的无缓存响应头
        httpResponse.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
        httpResponse.setHeader("Pragma", "no-cache");
        httpResponse.setDateHeader("Expires", 0);
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void destroy() {}
}

编译后将class文件放入WEB-INF/classes目录,Tomcat会自动加载该Filter,确保浏览器不会缓存目标路径下的文件。

补充说明

Firefox正常加载是因为不同浏览器的缓存校验策略存在差异:Firefox对静态资源的缓存有效期校验更严格,而Chrome/Edge会优先遵循强缓存规则,因此需要通过Tomcat配置+响应头的双重方式彻底禁用缓存。

内容的提问来源于stack exchange,提问作者RoR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:49:53