我通过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
。
如何设置它们,以及我需要添加哪些标题才能获得所需的行为?
请注意,我还使用Spring Security
默认添加以下标头:
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Expires:0
Pragma:no-cache
这些标题适用于“普通”页面,但我不希望它们用于上面显示的处理/file/**
的方法。
答案 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();