Перенаправление в контроллерах spring3

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