Tomcat9下Struts应用静态资源缓存失效致性能慢求助
静态资源缓存失效问题求助
近期升级了基于Struts、Tomcat、MySQL、Apache的应用(Tomcat版本更新为9),发现js、css、png等静态资源无法被浏览器缓存,导致应用运行缓慢,传输字节量增加、加载时长变长。
静态资源引用方式如下:
<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
已尝试以下操作但未解决问题:
- 在Tomcat连接器端口添加压缩配置:
仅减少了传输字节数,静态资源仍未被缓存,加载时长无改善。compression="on" compressibleMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json" - 在httpd.conf中添加模块:
LoadModule expires_module modules/mod_expires.so LoadModule cache_module modules/mod_cache.so LoadModule disk_cache_module modules/mod_disk_cache.so - 添加meta标签:
<meta http-equiv="Cache-control" content="public,max-age:3600">
补充截图说明:
- 缓存正常的旧应用:响应头包含正确的缓存过期标识,静态资源命中缓存
- 缓存失效的新应用:响应头无有效缓存控制字段,每次请求都重新加载资源
全局配置解决方案
1. Tomcat侧配置(conf/web.xml)
利用Tomcat自带的ExpiresFilter设置静态资源缓存规则,添加以下配置:
<!-- 确保MIME类型映射正确 --> <mime-mapping> <extension>js</extension> <mime-type>application/javascript</mime-type> </mime-mapping> <mime-mapping> <extension>css</extension> <mime-type>text/css</mime-type> </mime-mapping> <mime-mapping> <extension>png</extension> <mime-type>image/png</mime-type> </mime-mapping> <!-- 配置过期过滤器 --> <filter> <filter-name>ExpiresFilter</filter-name> <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class> <!-- CSS缓存1个月 --> <init-param> <param-name>ExpiresByType text/css</param-name> <param-value>access plus 1 month</param-value> </init-param> <!-- JS缓存1个月 --> <init-param> <param-name>ExpiresByType application/javascript</param-name> <param-value>access plus 1 month</param-value> </init-param> <!-- PNG图片缓存1个月 --> <init-param> <param-name>ExpiresByType image/png</param-name> <param-value>access plus 1 month</param-value> </init-param> </filter> <filter-mapping> <filter-name>ExpiresFilter</filter-name> <url-pattern>*.js</url-pattern> <url-pattern>*.css</url-pattern> <url-pattern>*.png</url-pattern> <!-- 可添加其他静态资源后缀 --> </filter-mapping>
2. Apache侧配置(httpd.conf)
如果使用Apache反向代理Tomcat,直接让Apache处理静态资源并配置缓存:
# 配置缓存存储路径(需确保Apache对该路径有读写权限) CacheRoot "/var/cache/apache2" CacheEnable disk "/js" CacheEnable disk "/css" CacheEnable disk "/images" # 开启过期控制 ExpiresActive On ExpiresByType text/css "access plus 1 month" ExpiresByType application/javascript "access plus 1 month" ExpiresByType image/png "access plus 1 month" # 可选:设置ETag增强缓存验证 FileETag MTime Size
注意事项
- Tomcat的
ExpiresFilter是9.x版本内置组件,无需额外引入依赖 - Apache缓存路径需配置正确的权限,避免缓存写入失败
- 若静态资源会更新,建议搭配版本化文件名(如
bootstrap.min.v2.js),避免缓存过期前用户无法获取最新资源
内容的提问来源于stack exchange,提问作者mon
相关产品推荐
相关产品推荐

