2012-10-21 99 views
4

我希望我的Spring Controller能夠緩存返回的內容。我發現了很多關於如何禁用緩存的問題。我想知道如何啓用緩存。我的控制器看起來像這樣的:在SpringMVC應用中緩存HTTP響應

@Controller 
public class SimpleController { 

    @RequestMapping("/webpage.htm") 
    public ModelAndView webpage(HttpServletRequest request, 
           HttpServletResponse response) { 
     ModelAndView mav = new ModelAndView("webpage"); 
     httpServletResponse.setHeader(「Cache-Control」, 「public」); 
     //some code 
     return mav; 
    } 
} 

正如你可以看到我已經添加了一行:httpServletResponse.setHeader(「Cache-Control」, 「public」);設置緩存,但在我的瀏覽器,當我刷新此頁面我仍然得到同樣的狀態結果:200 OK。我怎樣才能達到結果304 not modified?我可以在這個方法上設置註釋@ResponseStatus(value = HttpStatus.NOT_MODIFIED),但它只是狀態還是實際的緩存?

回答

8

14.9.1 What is Cacheable引用:

public - 表示響應可以通過任何高速緩存被緩存,即使它通常僅在非共享高速緩存是不可高速緩存或高速緩存。

基本上Cache-Control: public是不夠的,它只會要求瀏覽器正常緩存不緩存的資源,例如,通過HTTPS。

緩存在HTTP其實是相當複雜的,它涉及到其他幾個標題:

  • Cache-Control - 上面

  • Expires討論 - 當給定資源應被視爲陳舊

  • Last-Modified - 何時最後修改資源

  • ETag - 資源的唯一的標籤,在每一個版本

  • Vary改變 - 獨立的緩存基於不同的頁眉

  • If-Modified-SinceIf-None-Match ...

我發現Caching Tutorial是相當全面。並非所有頭文件都是一起使用的,你必須確定你在做什麼。因此我建議使用EhCache web caching等內置解決方案。

另外,用這樣的低級細節污染你的控制器並不是一個好主意。

+0

你能看看這個嗎? TNX! http://stackoverflow.com/questions/19319915/set-the-caching-of-get-request-on-server – Spring