2017-05-21 58 views
0

我通過Spring @Controller從文件系統提供文件,並且我想盡可能地使用瀏覽器緩存。Http標頭將永久緩存文件直到修改

這裏是處理請求的方法:

@ResponseBody 
@GetMapping(value = "/file/{f:.*}") 
public FileSystemResource getFile(@PathVariable("f") String fileName, HttpServletResponse response) { 

    File file = new File("/folder/" + fileName); 

    response.setHeader("Cache-Control", CacheControl.maxAge(7, TimeUnit.DAYS).cachePrivate().getHeaderValue()); 
    response.setDateHeader("Last-Modified", file.lastModified()); 
    response.setHeader("ETag", "" + file.lastModified()); 

    return new FileSystemResource(file); 
} 

瀏覽器應該永遠緩存中的文件,但自從上次請求是否被修改的文件系統。

我不知道如何設置Cache-ControlExpires

如何設置它們,以及需要添加哪些標題才能獲得所需的行爲?

注意,我還使用Spring Security在默認情況下增加了以下標題:

Cache-Control:no-cache, no-store, max-age=0, must-revalidate 
Expires:0 
Pragma:no-cache 

這些頭都很好,「正常」的網頁,但我不」希望他們對上述處理/file/**所示的方法。

回答

1

通常使用ETag標頭。從ETag的官方Spring文檔:

一個ETag(實體標記)是用於確定在 給定的URL內容變化的 HTTP/1.1兼容的Web服務器返回的HTTP響應頭。

使用ETags的請求標頭是"If-None-Match""If-Match"。這些用於使請求有條件。

編輯:爲了使它與Spring Security一起工作,您必須禁用設置這些標頭。在配置方法中,您可以添加httpSecurity.headers().cacheControl().disable();