web-dev-qa-db-fra.com

Spring MVC @RestController et redirection

J'ai un REST noeud final implémenté avec Spring MVC @RestController. Parfois, cela dépend des paramètres d'entrée dans mon contrôleur. Je dois envoyer une redirection http sur le client.

Est-ce possible avec Spring MVC @RestController et si oui, pourriez-vous s'il vous plaît montrer un exemple?

56
alexanoid

Ajoutez un paramètre HttpServletResponse à votre méthode de gestionnaire, puis appelez response.sendRedirect("some-url");

Quelque chose comme:

@RestController
public class FooController {

  @RequestMapping("/foo")
  void handleFoo(HttpServletResponse response) throws IOException {
    response.sendRedirect("some-url");
  }

}
95
Neil McGuigan

Pour éviter toute dépendance directe sur HttpServletRequest ou HttpServletResponse, je suggère une implémentation "pure Spring" renvoyant un ResponseEntity comme ceci:

HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create(newUrl));
return new ResponseEntity<>(headers, HttpStatus.MOVED_PERMANENTLY);

Si votre méthode retourne toujours une redirection, utilisez ResponseEntity<Void>, sinon tout ce qui est retourné normalement en tant que type générique.

34
Arne Burmeister

Je suis tombé sur cette question et j'ai été surpris de constater que personne ne mentionnait RedirectView. Je viens de le tester, et vous pouvez le résoudre de manière propre et 100% printanière avec:

@RestController
public class FooController {

    @RequestMapping("/foo")
    public RedirectView handleFoo() {
        return new RedirectView("some-url");
    }
}
3
DhatGuy

redirect signifie code http 302, qui signifie Found dans springMVC.

Voici une méthode util, qui pourrait être placée dans une sorte de BaseController:

protected ResponseEntity found(HttpServletResponse response, String url) throws IOException { // 302, found, redirect,
    response.sendRedirect(url);
    return null;
}

Mais parfois, vous voudrez peut-être renvoyer le code http 301 à la place, ce qui signifie moved permanently.

Dans ce cas, voici la méthode util:

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