从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
相关产品推荐
相关产品推荐

