Общий обработчик запросов контроллера Spring MVC 3

#java #spring-mvc

#java #spring-mvc

Вопрос:

У меня есть контроллер, который обрабатывает несколько запросов, которые должны быть проверены на наличие одного и того же значения cookie. Это означает, что в каждом обработчике запроса я должен выполнять одну и ту же проверку.

 @Controller
public class MyController {

    @RequestMapping("/Path")
    public String Handler1(@CookieValue(required = false, value = "Cookie") String cookie) {

        if (cookie != null) {
            handleNoCookie();
        }
        handleRequest1();
    }

    @RequestMapping("/AnotherPath")
    public String Handler2(@CookieValue(required = false, value = "Cookie") String cookie) {

        if (cookie != null) {
            handleNoCookie();
        }
        handleRequest2();
    }
and so on...
}
  

Есть ли способ извлечь дублированную проверку this в какой-либо метод, который выполнит проверку до выполнения фактического обработчика?

Спасибо.

Ответ №1:

Вы могли бы использовать перехватчик для … «перехватывайте» запросы и обрабатывайте вашу логику, если cookie там нет. Вы можете запустить его до того, как к контроллеру будет применен метод предварительной обработки.

API: HandlerInterceptor

Комментарии:

1. Спасибо! Это выглядит как решение.

Ответ №2:

Если существует большое количество методов обработки, вы могли бы заглянуть в AOP Spring, чтобы реализовать рекомендации по проверке файлов cookie для всех методов.

http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

Комментарии:

1. Спасибо btreat. Но я надеялся остаться в MVC framework.

Ответ №3:

Перехватчик AOP, предложенный в других ответах, является конфигурационным излишеством.

Аналогичная функциональность может быть достигнута с помощью аннотации @ModelAttribute. Он доступен с весны 2.5. Методы, аннотированные с помощью @ModelAttribute , должны генерировать параметры для модели представления. Эти методы вызываются перед каждым методом, аннотированным с помощью @RequestMapping .

Кажется, что это работает, если аннотированный метод ничего не возвращает (void-method). В этом случае он работает как некоторая воображаемая аннотация «BeforeEveryRequest». Это выглядит следующим образом:

 @ModelAttribute
public void tagController(HttpServletRequest request) {
    request.setAttribute(VERSION_PARAMETER, version());
}
  

Обновить:
Есть небольшой побочный эффект. Он добавляет к модели значение dummi. Ключ — это строка «void», а значение — null .