with requestmapping mvc framework spring rest spring-mvc redirect http-redirect

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