[SpringWebサーブレットの公式文書を読み込む]1.Spring MVC (9) HTTP Caching


1.9 HTTP Caching
HTTPキャッシュは、Webアプリケーションのパフォーマンスを大幅に向上させることができます.HTTPキャッシュは、Cache-Control応答ヘッダおよび条件付き要求ヘッダ(例えば、Last-ModifiedおよびETag)を中心とする.Cache-Controlは、個人(ブラウザなど)およびパブリック(エージェントなど)キャッシュが応答をキャッシュおよび再使用する方法を提案する.ETagヘッダは、コンテンツを変更せずに本文なしの条件要求(NOT MODIFED)を実行するために使用される.ETagは、Last-Modifiedヘッダーのより詳細な継承者と見なすことができる.
Spring Web MVCで使用可能なHTTPキャッシュに関するオプションについて説明します.
1.9.1 CacheControlCacheControlは、Cache-Controlヘッダーに関する設定構成をサポートし、複数の位置で引数を実行できます.

  • WebContentInterceptor

  • WebContentGenerator

  • Controllers

  • Static Resources
  • RFC 7234は、Cache-Control応答ヘッダのすべての可能な説明を説明するが、CacheControlタイプは、使用例を中心とした方法を採用し、典型的なスキームに重点を置いている.
    // Cache for an hour - "Cache-Control: max-age=3600"
    CacheControl ccCacheOneHour = CacheControl.maxAge(1, TimeUnit.HOURS);
    
    // Prevent caching - "Cache-Control: no-store"
    CacheControl ccNoStore = CacheControl.noStore();
    
    // Cache for ten days in public and private caches,
    // public caches should not transform the response
    // "Cache-Control: max-age=864000, public, no-transform"
    CacheControl ccCustom = CacheControl.maxAge(10, TimeUnit.DAYS).noTransform().cachePublic();
    WebContentGeneratorはまた、より単純なcachePeriod属性(秒単位で定義)を可能にする.
  • -1の値は、Cache-Control応答ヘッダを生成しない.
  • 0'Cache-Control: no-store'命令を使用してキャッシュを防止します.
  • n > 0の値は、'Cache-Control: max-age=n'命令キャッシュn秒の応答を使用する.
  • 1.9.2 Contollers
    コントローラは、HTTPキャッシュの明示的なサポートを追加できます.リソースのlastModifiedまたはETagの値は、条件要求ヘッダと比較する前に計算する必要があります.コントローラは、ResponseEntityETagヘッダおよびCache-Control設定を追加することができ、以下の例に示す.
    @GetMapping("/book/{id}")
    public ResponseEntity<Book> showBook(@PathVariable Long id) {
    
        Book book = findBook(id);
        String version = book.getVersion();
    
        return ResponseEntity
                .ok()
                .cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
                .eTag(version) // lastModified is also available
                .body(book);
    }
    条件要求タイトルと比較して、コンテンツが変更されていない場合、前の例では304(NOT MODIFIED)応答が送信され、本文は空である.そうでなければ、応答はETagおよびCache-Controlヘッダを追加する.
    次の例では、コントローラの条件要求ヘッダーも表示できます.
    @RequestMapping
    public String myHandleMethod(WebRequest request, Model model) {
    
        long eTag = ... // (1)
    
        if (request.checkNotModified(eTag)) {
            return null;  // (2)
        }
    
        model.addAttribute(...); // (3) 
        return "myViewName";
    }

  • アプリケーション別の計算

  • 応答304(NOT MODIFIED)-追加処理なしに設定される.

  • リクエストの処理を続行します.
  • eTag値、lastModified値または両方について条件付き確認要求があり、3つの変換がある.条件付きGETおよびHEAD要求に対して、応答は304(NOT MODIFIED)に設定され得る.条件付きのPOSTPUT、およびDELETEについては、同時修正を回避するために応答を412に設定することができる.
    1.9.3 Static Resources
    最適なパフォーマンスを得るためには、Cache-Controlおよび条件応答ヘッダの静的リソースが必要である.Static Resource構成セクションを参照してください.
    1.9.4 ETag FilterShallowEtagHeaderFilterを使用すると、応答で計算された「浅い」eTagの値を追加することができ、CPU時間ではなく帯域幅を節約することができる.Shallow ETagを参照してください.