Tengo un RESTO de extremo implementado con Spring MVC @RestController. En algún momento, depende de los parámetros de entrada en mi controlador necesito enviar http redirect en el cliente.

Es posible con Spring MVC @RestController y si es así, por favor podría mostrar un ejemplo ?

InformationsquelleAutor alexanoid | 2015-03-16

5 Comentarios

  1. 95

    Agregar un HttpServletResponse parámetro a su Método de Controlador, a continuación, llamar a response.sendRedirect("some-url");

    Algo como:

    @RestController
    public class FooController {
    
      @RequestMapping("/foo")
      void handleFoo(HttpServletResponse response) throws IOException {
        response.sendRedirect("some-url");
      }
    
    }
    • Lamentablemente esto parece la única solución. Yo también esperaba que hay una manera mejor sin HttpServletResponse parámetro.
    • en realidad, es bastante triste. Para la mayor parte, es posible completamente abstracta, Spring MVC controladores de distancia de cualquier dependencia de HTTP como protocolo de transporte en todo, pero que, desafortunadamente, no es posible aquí.
    • Me gusta tanto esta solución y el uno por @Arne Burmeister, pero ninguno de ellos resolver mi problema de mi navegador, no el manejo de la redirección (HTTP 302) de un XHR respuesta de la solicitud debido a las razones mencionadas aquí
    • Este es 302, acerca de cómo volver 301 ?
  2. 34

    Para evitar cualquier dependencia directa con HttpServletRequest o HttpServletResponse sugiero un «pura de Manantial» la aplicación de devolver un ResponseEntity como este:

    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, uso ResponseEntity<Void>, de lo contrario lo que se devuelve normalmente como tipo genérico.

    • O en una línea return ResponseEntity.status(HttpStatus.MOVED_PERMANENTLY).header(HttpHeaders.LOCATION, newUrl).build();
    • ¿NewUrl en este caso tiene que ser una dirección URL completa? Si es así, esta solución sería torpe en el mejor de cuando redireccionar a otra URL en su aplicación, ya que tendría que construir toda la URL. El uso de HttpServletResponse le permite enviar una redirección relativa al contenedor de servlets de la raíz.
  3. 3

    Llegó a través de esta pregunta y se sorprendió de que nadie menciona RedirectView. Yo sólo he probado, y puede resolver esto en un lugar limpio y 100% primavera manera con:

    @RestController
    public class FooController {
    
        @RequestMapping("/foo")
        public RedirectView handleFoo() {
            return new RedirectView("some-url");
        }
    }
  4. 0

    redirect significa código http 302, lo que significa que Found en springMVC.

    Aquí es un util método, que podría ser colocado 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 quizás desee devolver http de código 301 en su lugar, lo que significa que moved permanently.

    En ese caso, aquí es util método:

    protected ResponseEntity movedPermanently(HttpServletResponse response, String url) { //301, moved permanently,
        return ResponseEntity.status(HttpStatus.MOVED_PERMANENTLY).header(HttpHeaders.LOCATION, url).build();
    }
  5. -9

    si @RestController devuelve un Cadena puedes usar algo como esto

    return "redirect:/other/controller/";

    y este tipo de redirección es sólo para OBTENER solicitud, si desea utilizar otro tipo de solicitud de uso HttpServletResponse

    • Se trabajará sólo para @Controller pero no para el @RestController que es una versión especializada de @Controller y agregar @ResponseBody anotación. Framework Spring convertirá el valor de retorno y la escritura a la respuesta http de forma automática. @RestController public class RedirectController { @RequestMapping("/redirect") public String redirect() { return "redirect:/other/controller/"; } } y si vamos a tratar de acceder a esa url curl localhost:8080/redirect simplemente vamos a ver redirect:/other/controller/ cadena como resultado.
    • leer la respuesta completa 😀
    • Anton Balaniuc es correcto, y la lectura de toda su respuesta aún no es correcto. En un RestController simplemente devolverá la Cadena «redirect:/otros/controlador», no va a redirigir

Dejar respuesta

Please enter your comment!
Please enter your name here