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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:12:51