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

Java EE 控制瀏覽器快取策略:Response 標頭精確配置 Cache-Control、Expires、Pragma

     編輯:Java 綜合教學

Java EE 控制瀏覽器快取策略:Response 標頭精確配置 Cache-Control、Expires、Pragma

瀏覽器預設快取行為不一,透過 HTTP 回應標頭可精確控制資源快取與否。本文詳細說明「禁用快取」與「啟用快取」兩種場景的標頭配置差異與代碼實現。

一、完全禁用快取(適用於動態頁面、敏感資料、即時資訊)

// 設定編碼
response.setContentType("text/html;charset=UTF-8");

// 禁用快取三大標頭
response.setHeader("Expires", "-1");                    // 立即過期
response.setHeader("Cache-Control", "no-cache");        // HTTP/1.1 不快取
response.setHeader("Pragma", "no-cache");               // HTTP/1.0 相容

原理解析:

  • Expires: -1:過期時間設為過去,瀏覽器視為已過期。
  • Cache-Control: no-cache:要求每次向伺服器驗證(可配合 must-revalidate)。
  • Pragma: no-cache:舊版瀏覽器/代理相容。

二、啟用快取(適用於靜態資源:圖片、CSS、JS、字型)


關鍵點:

  • setDateHeader 自動格式化為 GMT 時間(如 Wed, 21 Oct 2025 07:28:00 GMT)。
  • max-age 優先級高於 Expires,建議兩者同時設定。
  • public 允許 CDN/代理快取;private 僅瀏覽器快取(含用戶資訊頁面)。
  • 避坑: 1000L 必須加 L,否則乘法溢位導致負數時間。

三、完整圖片快取示範代碼

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    resp.setContentType("image/jpeg");
    resp.setDateHeader("Last-Modified", System.currentTimeMillis());
    resp.setDateHeader("Expires", System.currentTimeMillis() + 1000L * 3600 * 24 * 30);
    resp.setHeader("Cache-Control", "public, max-age=2592000");
    resp.setHeader("Pragma", "Pragma");

    try (FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/1.jpg"));
         ServletOutputStream os = resp.getOutputStream()) {
        byte[] buf = new byte[1024];
        int len;
        while ((len = fis.read(buf)) != -1) os.write(buf, 0, len);
    }
}

快取標頭設置效果截圖

四、進階:條件請求與 ETag

  • Last-Modified + If-Modified-Since:基於修改時間驗證。
  • ETag + If-None-Match:基於內容指紋驗證(更精確,支援內容未變但時間變的情況)。
  • Spring MVC 提供 ShallowEtagHeaderFilter 自動生成 ETag。

五、最佳實踐清單

資源類型建議策略
HTML 動態頁no-cache, no-store, must-revalidate
API JSONno-cache(或短快取 + ETag)
靜態資源 (v1.2.3.css)長快取 (1年) + 檔名含雜湊版本號
使用者頭像private, max-age=3600 + ETag

精準的快取控制能大幅降低伺服器負載、提升頁面載入速度,是 Web 效能優化的第一道防線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved