1

我有一个由 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" />

我在这里做错了什么?

4

3 回答 3

2

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

于 2011-03-05T22:08:21.797 回答
1

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

另一种方法是在 url 中添加一个随机属性,由 javascript 生成。就像是:

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

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

于 2011-03-04T01:07:08.013 回答
0

这已经被 Spring 支持了很长一段时间,并且在最近的版本中得到了改进。请参阅有关此的参考文档

@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);
    }
}
于 2015-05-31T21:22:41.390 回答