Umleitungen (Redirects) sind ein wichtiger Bestandteil von Webanwendungen und werden verwendet, um Benutzer oder Anfragen von einer URL zu einer anderen weiterzuleiten. In Spring Boot können Umleitungen sowohl innerhalb der Anwendung als auch zu externen URLs konfiguriert werden. Umleitungen werden oft verwendet, wenn eine Ressource nach der Erstellung oder Aktualisierung an einer neuen Adresse verfügbar ist, oder um Benutzer von alten URLs zu den neuen zu leiten.
In diesem Kapitel werden wir die verschiedenen Möglichkeiten der Umleitung in Spring Boot REST Services besprechen und die Verwendung von HTTP-Statuscodes und Best Practices erläutern.
Eine Umleitung tritt auf, wenn ein Server eine Antwort mit einem HTTP-Statuscode der 3xx-Serie zurückgibt, der dem Client mitteilt, dass er eine neue Anfrage an eine andere URL senden soll. Die am häufigsten verwendeten Umleitungsstatuscodes sind:
Spring Boot bietet Mechanismen, um sowohl interne als auch externe Umleitungen in Webanwendungen zu handhaben.
RedirectViewIn Spring Boot können Sie eine Umleitung zu einem anderen Endpunkt
innerhalb derselben Anwendung mit der Klasse
RedirectView erreichen. Dies wird häufig
verwendet, wenn Sie nach einer Aktion wie dem Erstellen oder
Aktualisieren einer Ressource auf eine andere Seite umleiten
möchten.
RedirectView für eine interne Umleitungimport org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.view.RedirectView;
@Controller
public class ProductController {
@PostMapping("/createProduct")
public RedirectView createProduct(Product product) {
// Produkt erstellen
productService.saveProduct(product);
// Umleitung zur Liste der Produkte
return new RedirectView("/products");
}
}In diesem Beispiel wird nach dem Erstellen eines Produkts eine
Umleitung zur Seite /products durchgeführt, wo die Liste
aller Produkte angezeigt wird. Der Client wird aufgefordert, eine
GET-Anfrage an die neue URL zu stellen.
redirect:-PräfixEine andere Möglichkeit zur Umleitung in Spring Boot ist die
Verwendung des redirect:-Präfixes in den Rückgabewerten von
Controller-Methoden. Dies ist eine elegante Möglichkeit, Umleitungen
durch Rückgabe von Strings zu steuern.
redirect:import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class ProductController {
@PostMapping("/createProduct")
public String createProduct(Product product) {
// Produkt erstellen
productService.saveProduct(product);
// Umleitung zur Produktliste
return "redirect:/products";
}
}In diesem Fall wird nach dem Erstellen eines Produkts der String
redirect:/products zurückgegeben, was den Client
auffordert, eine GET-Anfrage an die URL /products zu
stellen.
Sie können auch Umleitungen zu externen URLs durchführen, indem Sie
das redirect:-Präfix mit einer vollständigen URL
verwenden.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class ExternalRedirectController {
@GetMapping("/external")
public String redirectToExternal() {
// Umleitung zu einer externen URL
return "redirect:https://www.example.com";
}
}In diesem Beispiel wird der Benutzer zu
https://www.example.com umgeleitet, wenn die URL
/external aufgerufen wird. Dies führt zu einer externen
Umleitung zu einer anderen Website.
ResponseEntity für UmleitungenIn einigen Fällen möchten Sie eine Umleitung mit einer expliziten
Kontrolle über den HTTP-Statuscode und die Header implementieren. Dies
kann mit ResponseEntity erreicht werden.
ResponseEntityimport org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class ProductController {
@PostMapping("/createProduct")
public ResponseEntity<Void> createProduct(Product product) {
productService.saveProduct(product);
// HTTP-Header mit der neuen Location setzen
HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create("/products"));
// 303 See Other als Statuscode zurückgeben
return new ResponseEntity<>(headers, HttpStatus.SEE_OTHER);
}
}In diesem Beispiel wird eine HTTP-Umleitung mithilfe von
ResponseEntity und einem 303-Statuscode
(SEE_OTHER) durchgeführt. Die neue Location wird über die
Header übermittelt.
Es gibt verschiedene Arten von Umleitungen, die jeweils mit einem bestimmten HTTP-Statuscode verbunden sind. Hier sind die gebräuchlichsten:
301 Moved Permanently: Wird verwendet, wenn die Ressource dauerhaft an eine neue Adresse verschoben wurde. Der Client (und Suchmaschinen) sollte sich diese neue Adresse merken und in Zukunft an die neue URL senden.
302 Found (Moved Temporarily): Wird verwendet, wenn die Ressource vorübergehend an einer anderen Adresse verfügbar ist. Der Client sollte die alte URL weiterhin verwenden, da sich die Ressource möglicherweise wieder an die ursprüngliche Adresse verschiebt.
303 See Other: Wird verwendet, um dem Client mitzuteilen, dass er eine GET-Anfrage an die neue Adresse senden soll, unabhängig davon, welche HTTP-Methode ursprünglich verwendet wurde. Dies wird häufig nach einer POST-Anfrage verwendet, um den Benutzer auf eine Ergebnis- oder Bestätigungsseite umzuleiten.
307 Temporary Redirect: Ist eine präzisere Version von 302 und weist den Client an, die gleiche HTTP-Methode zu verwenden, die in der ursprünglichen Anfrage verwendet wurde.
| HTTP-Statuscode | Beschreibung | Verwendung |
|---|---|---|
| 301 | Moved Permanently | Dauerhafte Umleitung |
| 302 | Found (Moved Temporarily) | Temporäre Umleitung |
| 303 | See Other | Umleitung nach POST zu einer neuen GET-URL |
| 307 | Temporary Redirect | Temporäre Umleitung mit gleicher Methode |
Verwenden Sie 303 nach POST-Anfragen: Nach einer
erfolgreichen POST-Anfrage sollten Sie den Statuscode 303
See Other verwenden, um den Client zu einer neuen GET-URL
umzuleiten. Dies verhindert das erneute Senden der POST-Daten bei einem
Seiten-Reload.
Externe Umleitungen sparsam verwenden: Externe Umleitungen sollten nur verwendet werden, wenn dies notwendig ist, da sie den Benutzer aus der aktuellen Anwendung herausführen.
Klare Verwendung von Statuscodes: Verwenden Sie 301 für dauerhafte Umleitungen und 302 oder 307 für temporäre Umleitungen. Der Client sollte wissen, ob er sich die neue URL merken muss.
Beachten Sie SEO-Bedenken bei Umleitungen: Wenn Umleitungen in öffentlichen Webseiten verwendet werden, sollten Sie sicherstellen, dass Suchmaschinen die korrekten Umleitungen (301 für dauerhafte, 302 für temporäre) erhalten.
Umleitungen sind ein wesentlicher Bestandteil von Webanwendungen,
insbesondere in RESTful APIs, um nach dem Erstellen oder Bearbeiten von
Ressourcen eine neue URL bereitzustellen. Spring Boot bietet einfache
Mechanismen, um interne und externe Umleitungen zu implementieren. Sie
können Umleitungen über RedirectView, das
redirect:-Präfix oder ResponseEntity steuern
und HTTP-Statuscodes anpassen, um den Client richtig zu informieren.
Durch die richtige Verwendung von Umleitungen und Statuscodes können Sie
eine bessere Benutzererfahrung und API-Interaktion sicherstellen.