java - 永久缓存文件直到修改的 HTTP header

标签 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

如何设置它们,以及我需要添加哪些 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/

相关文章:

java - Spring 集成: Force Webservice Outbound Gateway to Use TLSv1

npm - 有和没有 "latest"的 JSDelivr URL 的区别

java - 在 javax.xml.bind 中创建一个通用集合

Java swing - ActionListener 应该去哪里?

java - 成功登录 google oauth2 时出现重定向错误

java - 方法参数类型不匹配异常 : How to find the controller method

ios - If-None-Match 和 NSURLConnection

ruby-on-rails - Rails fresh_when 应该在 etag 中包含当前用户 ID

java - 无序列表项目符号在 JEditorPane 中看起来像素化

java - java中stream、collect、forEach组合的代码流程