#spring #spring-mvc
#spring #spring-mvc
Вопрос:
В Spring 3 вы сопоставляете URL-адреса так же просто, как это:
@RequestMapping(value = "/index.html", method = RequestMethod.GET)
public String index(Model model) {
return "index";
}
Возможно ли создать такой метод для своего рода перенаправления на другой URL, например:
@RequestMapping(value = "/index.html", method = RequestMethod.GET)
public String index(Model model) {
return "second.html";
}
@RequestMapping(value = "/second.html", method = RequestMethod.GET)
public String second(Model model) {
//put some staff in model
return "second";
}
Ответ №1:
Перенаправлять не нужно — просто вызовите метод:
@RequestMapping(value = "/index.html", method = RequestMethod.GET)
public String index(Model model) {
return second(model);
}
@RequestMapping(value = "/second.html", method = RequestMethod.GET)
public String second(Model model) {
//put some staff in model
return "second";
}
Это одна из приятных особенностей стиля аннотаций; вы можете просто объединить свои методы вместе.
Если вам действительно нужно перенаправление, то вы можете вернуть его как представление:
@RequestMapping(value = "/index.html", method = RequestMethod.GET)
public View index(Model model) {
return new RedirectView("second.html");
}
@RequestMapping(value = "/second.html", method = RequestMethod.GET)
public String second(Model model) {
//put some staff in model
return "second";
}
Комментарии:
1. Я думаю, что в вашем методе есть недостаток безопасности. Что, если index() имеет авторизацию isAnonymous(), а second() имеет авторизацию «АУТЕНТИФИЦИРОВАННЫЙ»? Вызов second() непосредственно из index() не вызовет некрасивой ситуации? Это еще уродливее, поскольку теперь вызов защищенного second() выполняется из внутреннего метода, а не из внешнего запроса, поэтому коэффициент «ДОВЕРИЯ» будет намного выше при вызове second()?
2. @skaffman но если метод контроллера возвращает, например, ResponseEntity ?
Ответ №2:
Да, перенаправление будет работать. В индексном методе измените последнюю строку на return "redirect:/second.html" ;
Требуется отредактировать контекстный путь и сопоставление контроллера. Если DispatcherServlet сопоставлен с / ABC, а сопоставление запроса для контроллера равно / XYZ, тогда вам придется написать:
return "redirect:/ABC/XYZ/second.html";
Комментарии:
1. но если метод контроллера возвращает, например, ResponseEntity ?