Ich habe einen REST-Endpunkt mit Spring MVC @RestController implementiert. Abhängig von den Eingabeparametern in meinem Controller muss ich manchmal eine http-Umleitung auf dem Client senden.
Ist es mit Spring MVC @RestController möglich und wenn ja, können Sie bitte ein Beispiel zeigen?
spring
rest
spring-mvc
redirect
http-redirect
alexanoid
quelle
quelle
@RestController
Klassen, da er enthält@ResponseBody
. Ihre Zeichenfolge "Redirect:" wird nicht als Ansicht interpretiert.Antworten:
Fügen Sie
HttpServletResponse
Ihrer Handler-Methode einen Parameter hinzu und rufen Sie ihn aufresponse.sendRedirect("some-url");
Etwas wie:
@RestController public class FooController { @RequestMapping("/foo") void handleFoo(HttpServletResponse response) throws IOException { response.sendRedirect("some-url"); } }
quelle
302
, wie etwa Rückkehr301
?@RestController
Verwendung eine@Controller
und eine Methode, die aString
als Vorlage zurückgibtreturn "redirect:/mytemplate"
Um eine direkte Abhängigkeit von einer "reinen Spring" -Implementierung zu vermeiden
HttpServletRequest
oder dieseHttpServletResponse
vorzuschlagen, wird eine ResponseEntity wie folgt zurückgegeben:HttpHeaders headers = new HttpHeaders(); headers.setLocation(URI.create(newUrl)); return new ResponseEntity<>(headers, HttpStatus.MOVED_PERMANENTLY);
Wenn Ihre Methode immer eine Umleitung zurückgibt, verwenden Sie
ResponseEntity<Void>
, andernfalls wird alles, was normalerweise als generischer Typ zurückgegeben wird, verwendet.quelle
return ResponseEntity.status(HttpStatus.MOVED_PERMANENTLY).header(HttpHeaders.LOCATION, newUrl).build();
Kam über diese Frage und war überrascht, dass niemand RedirectView erwähnte. Ich habe es gerade getestet, und Sie können dies auf saubere, 100% ige Art und Weise lösen mit:
@RestController public class FooController { @RequestMapping("/foo") public RedirectView handleFoo() { return new RedirectView("some-url"); } }
quelle
redirect
bedeutet http-Code302
, wasFound
in springMVC bedeutet .Hier ist eine util-Methode, die in eine Art von platziert werden könnte
BaseController
:protected ResponseEntity found(HttpServletResponse response, String url) throws IOException { // 302, found, redirect, response.sendRedirect(url); return null; }
Aber manchmal möchten Sie vielleicht
301
stattdessen http-Code zurückgeben , was bedeutetmoved permanently
.In diesem Fall ist hier die util-Methode:
protected ResponseEntity movedPermanently(HttpServletResponse response, String url) { // 301, moved permanently, return ResponseEntity.status(HttpStatus.MOVED_PERMANENTLY).header(HttpHeaders.LOCATION, url).build(); }
quelle
Da die Umleitungen normalerweise auf einem nicht einfachen Weg benötigt werden, halte ich es für meine Lieblingslösung, eine Ausnahme auszulösen und später zu behandeln.
Verwenden eines ControllerAdvice
@ControllerAdvice public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { @ExceptionHandler(value = { NotLoggedInException.class }) protected ResponseEntity<Object> handleNotLoggedIn( final NotLoggedInException ex, final WebRequest request ) { final String bodyOfResponse = ex.getMessage(); final HttpHeaders headers = new HttpHeaders(); headers.add("Location", ex.getRedirectUri()); return handleExceptionInternal( ex, bodyOfResponse, headers, HttpStatus.FOUND, request ); } }
Die Ausnahmeklasse in meinem Fall:
@Getter public class NotLoggedInException extends RuntimeException { private static final long serialVersionUID = -4900004519786666447L; String redirectUri; public NotLoggedInException(final String message, final String uri) { super(message); redirectUri = uri; } }
Und ich löse es so aus:
if (null == remoteUser) throw new NotLoggedInException("please log in", LOGIN_URL);
quelle
Wenn Sie @RestController einen String zurückgeben , können Sie so etwas verwenden
return "redirect:/other/controller/";
Diese Art der Umleitung gilt nur für GET- Anforderungen. Wenn Sie einen anderen Anforderungstyp verwenden möchten, verwenden Sie HttpServletResponse
quelle
@Controller
nicht aber für die ,@RestController
die eine spezielle Version von ist@Controller
und Add@ResponseBody
Annotation. Spring Framework konvertiert den Rückgabewert und schreibt ihn automatisch in die http-Antwort.@RestController public class RedirectController { @RequestMapping("/redirect") public String redirect() { return "redirect:/other/controller/"; } }
und wenn wir versuchen, auf diese URL zuzugreifen, sehencurl localhost:8080/redirect
wir einfach einenredirect:/other/controller/
String als Ergebnis.