#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
.