Redirigir a una URL externa de la acción del controlador en Spring MVC

Me he dado cuenta de que el siguiente código está redirigiendo al usuario a una URL dentro del proyecto,

@RequestMapping(method = RequestMethod.POST) public String processForm(HttpServletRequest request, LoginForm loginForm, BindingResult result, ModelMap model) { String redirectUrl = "yahoo.com"; return "redirect:" + redirectUrl; } 

mientras que, a continuación, se está redireccionando correctamente según lo previsto, pero requiere http: // o 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; } 

Quiero que el redireccionamiento redirija siempre a la URL especificada, tenga o no un protocolo válido y no quiera redirigir a una vista. ¿Cómo puedo hacer eso?

Gracias,

Puedes hacerlo de dos maneras.

Primero:

  @RequestMapping(value = "/redirect", method = RequestMethod.GET) public void method(HttpServletResponse httpServletResponse) { httpServletResponse.setHeader("Location", projectUrl); httpServletResponse.setStatus(302); } 

Segundo:

  @RequestMapping(value = "/redirect", method = RequestMethod.GET) public ModelAndView method() { return new ModelAndView("redirect:" + projectUrl); } 

Al observar la implementación real de UrlBasedViewResolver y RedirectView, la redirección siempre será contextRelative si su objective de redirección comienza con /. Por lo tanto, enviar un //yahoo.com/path/to/resource no ayudaría a redirigir un protocolo relativo.

Entonces, para lograr lo que intentas, podrías hacer algo como:

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

Puede usar el RedirectView . Copiado desde JavaDoc :

Ver que redirige a una URL relativa de solicitud absoluta, relativa al contexto o actual

Ejemplo:

 @RequestMapping("/to-be-redirected") public RedirectView localRedirect() { RedirectView redirectView = new RedirectView(); redirectView.setUrl("http://www.yahoo.com"); return redirectView; } 

También puede usar una ResponseEntity , por ej.

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

Y por supuesto, redirect:http://www.yahoo.com retorno redirect:http://www.yahoo.com como lo mencionaron otros.

Otra forma de hacerlo es simplemente usar el método sendRedirect :

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

Para la URL externa, debe usar ” http://www.yahoo.com ” como URL de redireccionamiento.

Esto se explica en la redirección: prefijo de la documentación de referencia de Spring.

redirigir: / myapp / some / resource

redirigirá en relación con el contexto del servlet actual, mientras que un nombre como

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

redireccionará a una URL absoluta

Para mí funciona bien:

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

¿Intentó RedirectView donde puede proporcionar el parámetro contextRelative?

En resumen, "redirect:yahoo.com" o "redirect://yahoo.com" te prestarán a yahoo.com .

donde como "redirect:yahoo.com" le prestará your-context/yahoo.com es decir, para ex- localhost:8080/yahoo.com