Spring HTTP кеш управления - PullRequest
4 голосов
/ 02 марта 2012

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

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

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

Спасибо, Андреа

Обновление: pap предлагает использовать HandlerInterceptor, но я видел сообщение в нескольких форумах, в котором говорилось, чтоневозможно получить целевой метод внутри HandlerInterceptor и предложить вместо него использовать обычный AOP (не специально для кэширования).Проблема в том, что я не хочу добавлять параметр запроса ко всем моим методам, только чтобы сделать его доступным для аспекта.Есть ли способ избежать этого?

Ответы [ 2 ]

4 голосов
/ 02 марта 2012

Вы можете использовать следующий подход, описанный в Spring mvc справочное руководство

Поддержка заголовка ответа «Последнее изменение» для облегчения кэширования содержимого

@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";
}
2 голосов
/ 02 марта 2012

Один способ (который я использовал сам) - создать свой собственный 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>
...