在 Web 應用中,瀏覽器每次請求伺服器時,若圖片、CSS、JS 等靜態資源未被緩存,會導致伺服器負載過大、頁面載入緩慢。透過 HTTP 快取機制與 Servlet Filter,可精確控制客戶端與代理伺服器的快取行為,提升效能。
| 標頭 | 說明 |
|---|---|
| Cache-Control | 控制快取行為:no-cache(不快取)、public(可快取)、no-store(不儲存)、must-revalidate(必須驗證) |
| Pragma | HTTP/1.0 相容性,no-cache 禁用快取 |
| Expires | 過期時間(GMT 格式),過期後需重新請求 |
| Last-Modified | 資源最後修改時間,配合條件請求使用 |
@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);
}
}
@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");
}
}
<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>
no-cache, must-revalidate 確保資料即時性。ETag 或 Last-Modified 實現條件請求,減少頻寬浪費。