2011-03-03 9 views
1

Springコントローラによって動的に生成されたCSSファイルがあります。ハンドラーメソッドでCache-Controlレスポンスヘッダーを設定しましたが、何らかの理由で私のFireFoxが、キャッシュされたバージョンを使用する代わりに、参照を持つHTMLファイルを要求するときにCSSファイルを要求し続けます。Cache-Controlを設定しても、動的に生成されたCSSファイルはキャッシュされません。

ここにコードがあります。

@Controller 
@RequestMapping("/foo.css") 
public class FooController { 
    @RequestMapping(method = RequestMethod.GET) 
    public void show(HttpServletResponse response) { 
     try { 
      response.setHeader("Cache-Control", "max-age=3600"); 
      response.getWriter().println("this is a test."); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 

     System.out.println(new Date()); 
    } 
} 

そして、HTMLファイルは通常の方法でCSSファイルを参照します。

<link rel="stylesheet" type="text/css" href="/foo.css" /> 

私はここで間違っていますか?

答えて

2

私はOPだけど、さらなる研究の後、私はあなたがこれを自分で実装する必要があることを決めました。キャッシュされたリソースを使用するために、クライアントブラウザが304応答コードを生成するようにサーバーを設定する必要がありますが、SpringまたはTomcatのどちらもこのout-of-boxをサポートしていません。

1

まず、ブラウザとプロキシサーバーは、ヘッダーにputされたHTTPキャッシュコントロールに準拠する必要はありません。彼らは助言だけです。ブラウザがキャッシュ要求を無視し、自分の設定で構成されているものに従っているかどうか。

これを行う別の方法は、javascriptによって生成されたURLにランダム属性を設定することです。ような何か:

<link type="text/css" href="/foo.css?d=328943298432" /> 

ここでは、このテーマについての素晴らしい記事がありますhttp://code.google.com/speed/page-speed/docs/caching.html

0

これはかなり長い間、Springによってサポートされており、最近のバージョンでは改善されています。 the reference documentation about thisを参照してください。

@Controller 
public class FooController { 

    @RequestMapping("/foo.css") 
    public ResponseEntity<String> show() { 

    String cssContent = generateCssContent(); 
    String version = hashCssContent(cssContent); 

    // automatically writes CacheControl + Etag headers 
    // generates HTTP 304 responses for conditional requests 
    return ResponseEntity 
     .ok() 
     .cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS)) 
     .eTag(version) // lastModified is also available 
     .body(cssContent); 
    } 
} 
関連する問題