2012-03-02 111 views
4

我看到你可以用AnnotationMethodHandlerAdapter bean控制缓存http头。春季HTTP缓存管理

我的问题是,我需要对缓存(在方法级别)有一个罚款grane控制。 最好的想法是像“@RequestCache(expire = 60)”这样的注释。

有没有这样的事情? 完成此任务的最佳方式是什么?

感谢, 安德烈

更新: PAP建议使用的HandlerInterceptor,但我已经看到多个论坛上的帖子说这是不可能得到的HandlerInterceptor内目标的方法和建议使用正规AOP而不是专门用于缓存。 问题是我不想将请求参数添加到我的所有方法中,只是为了使其可以访问该方面。有没有办法避免这种情况?

回答

3

您可以使用 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"; 
} 
+0

这是否也适用于与@ResponseBody一起返回图像? – yglodt 2016-12-08 21:07:02

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> 
+0

好的解决方案,但是,如果我明白,与AopUtils你可以得到目标类(控制器),但不是目标方法。有没有办法在方法级别检查注解? – 2012-03-02 10:41:16

+0

不容易。我想做同样的事情,但不容易获得。我最终注释了整个班级(并在需要不同的缓存策略时拆分控制器)。 – pap 2012-03-02 12:20:38