【问题标题】:Http headers to cache files forever until modified永久缓存文件的 Http 标头,直到被修改
【发布时间】:2017-05-21 15:00:21
【问题描述】:

我通过 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/** 的方法。

【问题讨论】:

    标签: java spring http-caching


    【解决方案1】:

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

    ETag(实体标签)是一个 HTTP 响应标头,由 符合 HTTP/1.1 的 Web 服务器,用于确定内容的变化 给定的网址。

    与 ETag 一起使用的请求标头是 "If-None-Match""If-Match"。这些用于使请求有条件。

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

    【讨论】:

      猜你喜欢
      • 2011-06-21
      • 2017-02-08
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多