2012-03-02 113 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