Перенаправить на внешний URL-адрес из действия контроллера в Spring MVC
Я заметил, что следующий код перенаправляет пользователя на URL-адрес внутри проекта,
@RequestMapping(method = RequestMethod.POST)
public String processForm(HttpServletRequest request, LoginForm loginForm,
BindingResult result, ModelMap model)
{
String redirectUrl = "yahoo.com";
return "redirect:" + redirectUrl;
}
тогда как следующее перенаправляется должным образом, как предполагалось, но требует http://или https://
@RequestMapping(method = RequestMethod.POST)
public String processForm(HttpServletRequest request, LoginForm loginForm,
BindingResult result, ModelMap model)
{
String redirectUrl = "http://www.yahoo.com";
return "redirect:" + redirectUrl;
}
Я хочу, чтобы перенаправление всегда перенаправлялось к указанному URL-адресу, имеет ли он в нем действительный протокол или нет, и не хочет перенаправлять на представление. Как я могу это сделать?
Спасибо,
Ответы
Ответ 1
Вы можете сделать это двумя способами.
Первый:
@RequestMapping(value = "/redirect", method = RequestMethod.GET)
public void method(HttpServletResponse httpServletResponse) {
httpServletResponse.setHeader("Location", projectUrl);
httpServletResponse.setStatus(302);
}
Во-вторых:
@RequestMapping(value = "/redirect", method = RequestMethod.GET)
public ModelAndView method() {
return new ModelAndView("redirect:" + projectUrl);
}
Ответ 2
Вы можете использовать RedirectView
. Скопировано из JavaDoc:
Просмотр, перенаправляющий относительный URL абсолютного, контекстного отношения или текущего запроса
Пример:
@RequestMapping("/to-be-redirected")
public RedirectView localRedirect() {
RedirectView redirectView = new RedirectView();
redirectView.setUrl("http://www.yahoo.com");
return redirectView;
}
Вы также можете использовать ResponseEntity
, например
@RequestMapping("/to-be-redirected")
public ResponseEntity<Object> redirectToExternalUrl() throws URISyntaxException {
URI yahoo = new URI("http://www.yahoo.com");
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setLocation(yahoo);
return new ResponseEntity<>(httpHeaders, HttpStatus.SEE_OTHER);
}
И, конечно, верните redirect:http://www.yahoo.com
, как упоминалось другими.
Ответ 3
Изучая фактическую реализацию UrlBasedViewResolver и RedirectView, перенаправление всегда будет contextRelative если ваша цель перенаправления начинается с /. Таким образом, отправка //yahoo.com/path/to/resource не помогла бы получить относительное перенаправление протокола.
Итак, чтобы достичь того, что вы пытаетесь, вы можете сделать что-то вроде:
@RequestMapping(method = RequestMethod.POST)
public String processForm(HttpServletRequest request, LoginForm loginForm,
BindingResult result, ModelMap model)
{
String redirectUrl = request.getScheme() + "://www.yahoo.com";
return "redirect:" + redirectUrl;
}
Ответ 4
Другой способ сделать это - просто использовать метод sendRedirect
:
@RequestMapping(
value = "/",
method = RequestMethod.GET)
public void redirectToTwitter(HttpServletResponse httpServletResponse) throws IOException {
httpServletResponse.sendRedirect("https://twitter.com");
}
Ответ 5
Для внешнего URL вы должны использовать " http://www.yahoo.com" в качестве URL-адреса перенаправления.
Это объясняется в переадресация: префикс справочной документации Spring.
редирект:/MyApp/некоторые/ресурс
будет перенаправляться относительно текущего контекста сервлета, тогда как имя, например
redirect: http://myhost.com/some/arbitrary/path
будет перенаправлен на абсолютный URL
Ответ 6
Для меня отлично работает:
@RequestMapping (value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<Object> redirectToExternalUrl() throws URISyntaxException {
URI uri = new URI("http://www.google.com");
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setLocation(uri);
return new ResponseEntity<>(httpHeaders, HttpStatus.SEE_OTHER);
}
Ответ 7
Вы попробовали RedirectView, где вы можете предоставить параметр contextRelative?
Ответ 8
Вы можете сделать это довольно лаконично, используя ResponseEntity
например:
@GetMapping
ResponseEntity<Void> redirect() {
return ResponseEntity.status(HttpStatus.FOUND)
.location(URI.create("http://www.yahoo.com"))
.build();
}
Ответ 9
Короче "redirect:yahoo.com"
или "redirect://yahoo.com"
предоставит вам yahoo.com
.
где "redirect:yahoo.com"
предоставит вам your-context/yahoo.com
т.е. для ex localhost:8080/yahoo.com