JBoss应用服务器Web应用Expires缓存设置异常问题
嘿,我来帮你解决这个JBoss缓存过滤器的问题!
问题根源分析
你遇到的这个情况,大概率是因为JBoss AS 7.1.1将Servlet过滤器默认作为单例实例管理了。如果你的过期时间计算逻辑是写在过滤器的init()方法里,或者用了类级别的静态变量来存储这个过期时间值,那这个值只会在服务器重启、过滤器初始化时计算一次,之后所有请求都会复用这个固定的时间,自然就变成了服务器重启时间加1个月,而不是每次请求的当前时间加1个月。
解决方案
核心思路就是:把过期时间的计算逻辑移到doFilter()方法内部,让它每次处理请求时都重新计算当前时间+1个月的数值,再设置到响应头里。
给你一个修正后的代码示例:
public class CacheFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 这里只做过滤器的初始化准备工作,不要计算过期时间 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; // 每次请求都重新计算当前时间 + 1个月的时间戳 long currentTime = System.currentTimeMillis(); // 简单处理为30天,如需精确月份可以用Calendar/Java8+的日期API long expiresTime = currentTime + 30L * 24L * 60L * 60L * 1000L; // 用setDateHeader自动转换为HTTP标准日期格式,比手动拼接字符串更可靠 httpResponse.setDateHeader("Expires", expiresTime); // 建议同时设置Cache-Control头,现代浏览器更优先遵循这个规则 httpResponse.setHeader("Cache-Control", "max-age=2592000"); // 30天对应的秒数 // 继续执行后续过滤链 chain.doFilter(request, response); } @Override public void destroy() { // 按需清理过滤器资源 } }
额外优化建议
- 如果需要精确的“1个月后”(比如考虑28/30/31天的月份差异),可以用Java的日期工具类来计算:
Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, 1); long expiresTime = calendar.getTimeInMillis();
- 检查你之前的代码,有没有把过期时间存在静态变量或者初始化方法里,一定要把这些逻辑移到
doFilter()中 - 同时设置
Expires和Cache-Control头,可以兼顾新旧浏览器的缓存规则兼容性
内容的提问来源于stack exchange,提问作者tigereye
相关产品推荐
相关产品推荐

