在SpringMVC应用程序中缓存HTTP响应

4

我希望我的Spring Controller能够缓存返回的内容。我找到了很多如何禁用缓存的问题,但我想知道如何启用缓存。我的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),但这只是状态还是实际缓存?

1个回答

8
引用自14.9.1 什么可缓存

public - 表示响应可以被任何缓存缓存,即使它通常是不可缓存的或只能在非共享缓存中缓存。

基本上,Cache-Control: public 不足以满足要求,它只是要求浏览器缓存通常不会被缓存的资源,例如HTTPS。
HTTP中的缓存实际上非常复杂,并涉及多个其他标头:
  • Cache-Control - 上文已讨论

  • Expires - 资源何时过期

  • Last-Modified - 资源最后修改时间

  • ETag - 资源的唯一标识符,在每次修订中更改

  • Vary - 基于不同的标头分别缓存

  • If-Modified-SinceIf-None-Match,...

我发现缓存教程非常全面。并不是所有标头都可以一起使用,你必须非常确定你正在做什么。因此,我建议使用内置解决方案,如EhCache Web缓存
此外,在控制器中污染这样的低级细节也不是一个好主意。

你能看一下这个吗?谢谢!https://dev59.com/GWIk5IYBdhLWcg3wYtX7 - Spring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接