【问题标题】:Caching HTTP reponses in a SpringMVC app在 Spring MVC 应用程序中缓存 HTTP 响应
【发布时间】:2012-10-21 11:45:58
【问题描述】:

我希望我的 Spring 控制器缓存返回的内容。我发现了很多关于如何禁用缓存的问题。我想知道如何启用缓存。我的控制器看起来像这样:

@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),但它只是状态还是实际缓存?

【问题讨论】:

    标签: java spring caching spring-mvc


    【解决方案1】:

    引用14.9.1 What is Cacheable:

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

    基本上Cache-Control: public 是不够的,它只要求浏览器缓存正常未缓存的资源,例如通过 HTTPS。

    HTTP 中的缓存实际上非常复杂,它涉及到其他几个标头:

    • Cache-Control - 上面讨论过

    • Expires - 当给定的资源应该被认为是陈旧的时

    • Last-Modified - 资源上次修改时间

    • ETag - 资源的唯一标签,在每个版本中都会更改

    • Vary - 基于不同标头的单独缓存

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

    我发现Caching Tutorial 非常全面。并非所有标题都可以一起使用,您必须真正确定自己在做什么。因此我推荐使用像EhCache web caching 这样的内置解决方案。

    此外,用如此低级的细节污染控制器也不是一个好主意。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多