我通过 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-Control
和Expires
。
如何设置它们,以及我需要添加哪些 header 才能获得所需的行为?
请注意,我还使用 Spring Security
,它默认添加以下 header :
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Expires:0
Pragma:no-cache
这些 header 对于“普通”页面来说很好,但我不希望它们用于上面显示的处理 /file/**
的方法。
最佳答案
通常使用 ETag header 来实现此目的。来自 ETags 的 Spring 官方文档:
An ETag (entity tag) is an HTTP response header returned by an HTTP/1.1 compliant web server used to determine change in content at a given URL.
与 ETag 一起使用的请求 header 为 "If-None-Match"和 "If-Match" 。这些用于使请求有条件。
编辑:要使其与 Spring Security 一起工作,您必须禁用设置这些 header 。在配置方法中,您可以添加 httpSecurity.headers().cacheControl().disable();
关于java - 永久缓存文件直到修改的 HTTP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44098317/