【问题标题】:Spring HTTP cache managementSpring HTTP 缓存管理
【发布时间】:2012-03-02 09:18:40
【问题描述】:

我看到您可以使用 AnnotationMethodHandlerAdapter bean 控制缓存 http 标头。

我的问题是我需要对缓存进行精细控制(在方法级别)。 最好的想法是有像“@RequestCache(expire=60)”这样的注释。

有这样的吗? 完成这项任务的最佳方法是什么?

谢谢, 安德烈亚

更新: pap 建议使用 HandlerInterceptor,但我看到多个论坛的帖子说不可能在 HandlerInterceptor 中获取目标方法,并建议改用常规 AOP(不是专门用于缓存)。 问题是我不想将请求参数添加到我的所有方法中,只是为了使其可以访问方面。有没有办法避免这种情况?

【问题讨论】:

    标签: spring spring-mvc browser-cache cache-control


    【解决方案1】:

    您可以使用中描述的以下方法 Spring mvc reference manual

    支持“Last-Modified”响应标头以促进内容缓存

    @RequestMapping(value = "/modified")
    @ResponseBody
    public String getLastModified(WebRequest request) {
        if (request.checkNotModified(lastModified.getTime())) {
            logger.error("Was not modified.");
            return null;
        }
        logger.error("Was modified.");
        //processing
        return "viewName";
    }
    

    【讨论】:

    • 这是否也适用于与@ResponseBody 结合返回图像?
    【解决方案2】:

    一种方法(我自己用过)是创建自己的HandlerInterceptor。

    public class CacheInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request,
                HttpServletResponse response, Object handler) throws Exception {
            Class<?> o = AopUtils.getTargetClass(handler);
            if (o.isAnnotationPresent(RequestCache.class)) {
                response.setDateHeader("Expires", o.getAnnotation(RequestCache.class).expire());
            }
            return true;
        }
        ...
    }
    

    然后

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="interceptors">
            <array>
                <bean class="bla.bla.CacheInterceptor " />
            </array>
        </property>
    </bean>
    

    【讨论】:

    • 很好的解决方案,但是,如果我理解的话,使用 AopUtils 您可以获得目标类(控制器),但不能获得目标方法。有没有办法在方法级别检查注解?
    • 不容易。我想做同样的事情,但它不容易获得。我最终注释了整个类(并在需要不同的缓存策略时拆分控制器)。
    猜你喜欢
    • 2016-05-05
    • 2018-02-10
    • 1970-01-01
    • 2016-12-30
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多