即使在设置Cache-Control之后,也不会缓存动态生成的CSS文件

时间:2011-03-03 23:43:13

标签: java spring cache-control

我有一个由Spring控制器动态生成的CSS文件。我在处理程序方法中设置了Cache-Control响应标头,但由于某种原因,我的FireFox在请求引用它的HTML文件而不是使用缓存版本时一直请求CSS文件。

这是代码。

@Controller
@RequestMapping("/foo.css")
public class FooController {
    @RequestMapping(method = RequestMethod.GET)
    public void show(HttpServletResponse response) {
        try {
            response.setHeader("Cache-Control", "max-age=3600");
            response.getWriter().println("this is a test.");
        }
        catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println(new Date());
    }
}

HTML文件以通常的方式引用CSS文件。

<link rel="stylesheet" type="text/css" href="/foo.css" />

我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

我是OP,但经过进一步的研究,我决定你需要自己实现。您需要让服务器为客户端浏览器生成304响应代码以使用缓存资源,但Spring和Tomcat都不支持这种开箱即用。

答案 1 :(得分:1)

首先,浏览器和代理服务器不需要遵守在标头上放置的HTTP缓存控件。他们只是建议性的。也许浏览器忽略缓存请求并遵守他的偏好配置。

另一种方法是将随机属性放入由javascript生成的url。类似的东西:

<link type="text/css" href="/foo.css?d=328943298432" />

这是一篇关于这个主题的好文章http://code.google.com/speed/page-speed/docs/caching.html

答案 2 :(得分:0)

Spring已经支持了很长一段时间,并且在最近的版本中得到了改进。请参阅the reference documentation about this

@Controller
public class FooController {

  @RequestMapping("/foo.css")
  public ResponseEntity<String> show() {

    String cssContent = generateCssContent();
    String version = hashCssContent(cssContent);

    // automatically writes CacheControl + Etag headers
    // generates HTTP 304 responses for conditional requests
    return ResponseEntity
        .ok()
        .cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
        .eTag(version) // lastModified is also available
        .body(cssContent);
    }
}