Общий обработчик запросов контроллера Spring MVC 3 - PullRequest
1 голос
/ 12 июня 2011

У меня есть контроллер, который обрабатывает несколько запросов, которые должны быть проверены на наличие того же значения 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...
}


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

Спасибо.

Ответы [ 3 ]

2 голосов
/ 12 июня 2011

Вы можете использовать перехватчик , чтобы ... "перехватывать" запросы и обрабатывать свою логику, если cookie не существует. Вы можете зажечь его до того, как на контроллер ударится, используя метод preHandle .

API: HandlerInterceptor

1 голос
/ 12 июня 2011

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

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

0 голосов
/ 09 октября 2013

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...