我希望我的Spring Controller能够缓存返回的内容。我发现了很多关于如何禁用缓存的问题。我想知道如何启用缓存。我的控制器看起来像这样:
@Controller
public class SimpleController {
@RequestMapping("/webpage.htm")
public ModelAndView webpage(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mav = new ModelAndView("webpage");
httpServletResponse.setHeader(“Cache-Control”, “public”);
//some code
return mav;
}
}
正如您所看到的,我添加了一行:httpServletResponse.setHeader(“Cache-Control”, “public”);
来设置缓存,但在我刷新此页面的浏览器中,我仍然获得相同的状态结果:200 OK
。如何获得结果304 not modified
?我可以在此方法上设置注释@ResponseStatus(value = HttpStatus.NOT_MODIFIED)
,但它只是状态还是实际缓存?
答案 0 :(得分:8)
public
- 表示任何缓存都可以缓存响应,即使它通常只在非共享缓存中不可缓存或可缓存。
基本上Cache-Control: public
是不够的,它只要求浏览器正常缓存而不是缓存资源,例如:通过HTTPS。
HTTP中的缓存实际上非常复杂,它涉及其他几个标题:
Cache-Control
- 上面讨论过
Expires
- 当给定资源应被视为过时
Last-Modified
- 资源上次修改时
ETag
- 资源的唯一标记,在每个修订版中都已更改
Vary
- 基于不同标题的单独缓存
If-Modified-Since
,If-None-Match
,...
我发现Caching Tutorial非常全面。并非所有标题都是一起使用的,您必须确定自己在做什么。因此,我建议使用EhCache web caching等内置解决方案。
使用如此低级别的细节污染控制器也不是一个好主意。