requestmapping - Spring MVC @RestController y redirigir
spring redirect with parameters (5)
Tengo un punto final REST implementado con Spring MVC @RestController. En algún momento, depende de los parámetros de entrada en mi controlador. Necesito enviar redirección http en el cliente.
¿Es posible con Spring MVC @RestController? Si es así, ¿podría mostrar un ejemplo?
Agregue un parámetro
HttpServletResponse
a su Método de
HttpServletResponse
y luego llame a
response.sendRedirect("some-url");
Algo como:
@RestController
public class FooController {
@RequestMapping("/foo")
void handleFoo(HttpServletResponse response) throws IOException {
response.sendRedirect("some-url");
}
}
Encontré esta pregunta y me sorprendió que nadie mencionara RedirectView. Lo acabo de probar y puedes resolver esto de manera limpia al 100% con:
@RestController
public class FooController {
@RequestMapping("/foo")
public RedirectView handleFoo() {
return new RedirectView("some-url");
}
}
Para evitar cualquier dependencia directa en
HttpServletRequest
o
HttpServletResponse
, sugiero una implementación "Spring pura" que devuelva una
ResponseEntity
como esta:
HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create(newUrl));
return new ResponseEntity<>(headers, HttpStatus.MOVED_PERMANENTLY);
Si su método siempre devuelve una redirección, use
ResponseEntity<Void>
, de lo contrario, lo que se devuelve normalmente como tipo genérico.
si @RestController devuelve una cadena , puede usar algo como esto
return "redirect:/other/controller/";
y este tipo de redireccionamiento es solo para solicitud GET , si desea usar otro tipo de solicitud, use HttpServletResponse
redirect
significa código http
302
, que significa
Found
en springMVC.
Aquí hay un método util, que podría colocarse en algún tipo de
BaseController
:
protected ResponseEntity found(HttpServletResponse response, String url) throws IOException { // 302, found, redirect,
response.sendRedirect(url);
return null;
}
Pero a veces puede querer devolver el código http
301
lugar, lo que significa que se
moved permanently
.
En ese caso, aquí está el método util:
protected ResponseEntity movedPermanently(HttpServletResponse response, String url) { // 301, moved permanently,
return ResponseEntity.status(HttpStatus.MOVED_PERMANENTLY).header(HttpHeaders.LOCATION, url).build();
}