Http标头永远缓存文件,直到修改

时间:2017-05-21 15:00:22

标签: java spring http-caching

我通过Spring @Controller从文件系统提供文件,我希望尽可能好地使用浏览器缓存。

以下是处理请求的方法:

@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 个答案:

答案 0 :(得分:1)

通常使用ETag标头。从关于ETags的官方Spring文档:

  

ETag(实体标记)是由a返回的HTTP响应头   符合HTTP / 1.1标准的Web服务器,用于确定a中内容的变化   给定网址。

ETag使用的请求标头是"If-None-Match""If-Match"。这些用于提出条件请求。

编辑:要使其与Spring Security一起使用,您必须禁用设置这些标头。在configure方法中,您可以添加httpSecurity.headers().cacheControl().disable();