我有一个由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" />
我在这里做错了什么?
答案 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);
}
}