Перенаправление на внешний URL-адрес из действия controllerа в 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; } 

Я хочу, чтобы redirect всегда перенаправлялось на указанный URL-адрес, имеет ли он в нем действительный протокол или нет и не хочет перенаправлять на представление. Как я могу это сделать?

Благодаря,

Вы можете сделать это двумя способами.

Первый:

  @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); } 

Изучая фактическую реализацию UrlBasedViewResolver и RedirectView, redirect всегда будет contextRelative, если ваша цель перенаправления начинается с /. Таким образом, отправка //yahoo.com/path/to/resource не помогла бы получить относительное redirect протокола.

Чтобы добиться того, что вы пытаетесь, вы можете сделать что-то вроде:

 @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; } 

Вы можете использовать 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 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 как упоминалось другими.

Другой способ сделать это – просто использовать метод sendRedirect :

 @RequestMapping( value = "/", method = RequestMethod.GET) public void redirectToTwitter(HttpServletResponse httpServletResponse) throws IOException { httpServletResponse.sendRedirect("https://twitter.com"); } 

Для внешнего URL вы должны использовать « http://www.yahoo.com » в качестве URL-адреса перенаправления.

Это объясняется в предикате справочной документации Spring.

переадресовать: / MyApp / некоторые / ресурс

будет перенаправляться относительно текущего контекста сервлета, тогда как имя, такое как

redirect: http://myhost.com/some/arbitrary/path

перенаправляет на абсолютный URL-адрес

Для меня отлично работает:

 @RequestMapping (value = "/{id}", method = RequestMethod.GET) public ResponseEntity 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); } 

Вы попробовали RedirectView, где вы можете предоставить параметр contextRelative?

Короче говоря, "redirect:yahoo.com" или "redirect://yahoo.com" предоставит вам yahoo.com .

где "redirect:yahoo.com" предоставит вам your-context/yahoo.com то есть для ex- localhost:8080/yahoo.com

  • Почему Spring MVC нуждается по крайней мере в двух контекстах?
  • UTF-8 в Spring MVC, проблема с формами FORM
  • Поиск URL вашего приложения только с помощью ServletContext
  • Как отправлять данные POST JSON с помощью Curl из терминала / командной строки для тестирования Spring REST?
  • Являются ли Spring MVC Controllers Singletons?
  • Как реализовать разбиение на страницы весной MVC 3
  • Spring 3 MVC: один-ко-многим в динамической форме (добавление / удаление при создании / обновлении)
  • Как преобразовать многостраничный файл в файл?
  • ServletContext и Spring MVC
  • Нет типов Spring WebApplicationInitializer, обнаруженных на пути к classам
  • Spring MVC @PathVariable получает усечение
  • Давайте будем гением компьютера.