2012-03-02 5 views
4

Я видел, что вы можете управлять заголовками кеша http с помощью компонента AnnotationMethodHandlerAdapter.Весеннее управление кешем HTTP

Моя проблема в том, что мне нужно иметь мелкий контроль над кешем (на уровне метода). Лучше всего подумать, что у вас есть что-то вроде аннотации типа «@RequestCache (expire = 60)».

Есть ли что-нибудь подобное? Каков наилучший способ выполнить эту задачу?

Спасибо, Andrea

Update: Пап предлагают использовать 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

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 вы можете получить целевой класс (контроллер), но не целевой метод. Есть ли способ проверить аннотацию на уровне метода? –

+0

Не легко. Я хотел сделать то же самое, но это нелегко получить. Я закончил аннотировать весь класс (и разделить контроллеры при необходимости разных стратегий кэширования). – pap

Смежные вопросы