首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java EE Filter 過濾器實現靜態資源緩存控制詳解

     編輯:Java 相關知識

背景與需求

在 Web 應用中,瀏覽器每次請求伺服器時,若圖片、CSS、JS 等靜態資源未被緩存,會導致伺服器負載過大、頁面載入緩慢。透過 HTTP 快取機制與 Servlet Filter,可精確控制客戶端與代理伺服器的快取行為,提升效能。

HTTP 快取相關標頭說明

標頭說明
Cache-Control控制快取行為:no-cache(不快取)、public(可快取)、no-store(不儲存)、must-revalidate(必須驗證)
PragmaHTTP/1.0 相容性,no-cache 禁用快取
Expires過期時間(GMT 格式),過期後需重新請求
Last-Modified資源最後修改時間,配合條件請求使用

禁用快取 Filter 實現

@WebFilter("/*")
public class NoCacheFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        chain.doFilter(req, res);
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", -1);
    }
}

啟用快取 Filter 實現(針對靜態資源)

@WebFilter("/static/*")
public class CacheFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        chain.doFilter(req, res);
        HttpServletResponse response = (HttpServletResponse) res;
        long expires = System.currentTimeMillis() + 24 * 60 * 60 * 1000; // 1 天
        response.setDateHeader("Expires", expires);
        response.setHeader("Cache-Control", "public, max-age=86400");
        response.setHeader("Pragma", "Pragma");
    }
}

web.xml 配置範例

<filter>
    <filter-name>CacheFilter</filter-name>
    <filter-class>cn.hncu.filter.CacheFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CacheFilter</filter-name>
    <url-pattern>/images/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CacheFilter</filter-name>
    <url-pattern>/css/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CacheFilter</filter-name>
    <url-pattern>/js/*</url-pattern>
</filter-mapping>

最佳實踐建議

  • 靜態資源(圖片、CSS、JS、字型)設定長期快取(如 1 年),並透過檔案名加入雜湊值實現版本控制。
  • 動態頁面、API 回應設定 no-cache, must-revalidate 確保資料即時性。
  • 配合 ETag 或 Last-Modified 實現條件請求,減少頻寬浪費。
  • 生產環境建議在 Nginx/Apache 層面統一處理快取標頭,降低應用伺服器負擔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved