如何在JBoss AS 7中启用静态资源缓存?
嘿,我之前也踩过Spring Web Flow + PrimeFaces静态资源缓存的坑,看到你说菜单切换慢、静态资源没缓存还显示1969年过期,这大概率是缓存头配置出问题了——那个1969年其实是时间戳0对应的时区偏移,本质就是资源被标记为立即过期,浏览器每次都得重新请求。给你几个针对性的解决办法:
1. 配置Spring MVC的静态资源缓存规则
Spring Web Flow依赖Spring MVC处理静态资源,你需要在配置里明确设置缓存时长,避免资源被标记为立即过期:
XML配置方式
<mvc:resources mapping="/resources/**" location="/resources/" cache-period="31536000"/> <!-- 31536000秒 = 1年,可根据业务需求调整时长 -->
Java Config配置方式
@Configuration @EnableWebMvc public class WebMvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**") .addResourceLocations("/resources/") .setCachePeriod(31536000); } }
这里的cache-period会对应HTTP响应头的Cache-Control: max-age值,之前的1969年异常,大概率是这个值没被正确设置,甚至被覆盖成了0/负数。
2. 开启PrimeFaces专属资源缓存
PrimeFaces有自己的资源处理机制,需要单独配置缓存规则:
在web.xml中添加PrimeFaces资源过滤器:
<filter> <filter-name>PrimeFaces Resource Filter</filter-name> <filter-class>org.primefaces.webapp.filter.ResourceFilter</filter-class> <init-param> <param-name>cache</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>cache-duration</param-name> <param-value>31536000</param-value> </init-param> </filter> <filter-mapping> <filter-name>PrimeFaces Resource Filter</filter-name> <url-pattern>/javax.faces.resource/*</url-pattern> </filter-mapping>
这个过滤器会专门处理PrimeFaces的内置资源(比如主题CSS、组件JS),确保它们的缓存头正确生效。
3. 检查反向代理/HTTP服务器的缓存配置
如果你的应用前端有Nginx、Apache这类反向代理,它们可能会覆盖Spring/PrimeFaces设置的缓存头:
以Nginx为例,添加静态资源缓存规则
location ~* \.(css|js|png|jpg|jpeg|gif|ico)$ { expires 1y; add_header Cache-Control "public, immutable"; }
这段配置会给静态资源设置1年的过期时间,同时标记immutable,告诉浏览器资源不会变更,无需重复验证。
4. 排查自定义拦截器/过滤器的干扰
有时候项目里的自定义拦截器、过滤器会无意间修改Cache-Control、Expires这类响应头。你可以检查所有HandlerInterceptor或Filter实现,看看有没有把Expires设置为0/负数的代码——这会直接导致浏览器显示1969年的过期时间。
验证方法
修改配置后重启服务器,打开浏览器开发者工具(F12)切换到Network标签页,刷新页面查看静态资源的响应头:确认Cache-Control的max-age是你设置的值,Expires显示为未来的时间(而非1969年)。
内容的提问来源于stack exchange,提问作者userDT

