Перенаправить на внешний 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