40 Umleitungen

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.

40.1 Grundlagen der Umleitung

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.

40.2 Umleitung in Spring Boot

40.2.1 1. Interne Umleitung mit RedirectView

In 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.

40.2.1.1 Beispiel: Verwendung von RedirectView für eine interne Umleitung

import 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.

40.2.2 2. Interne Umleitung mit redirect:-Präfix

Eine 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.

40.2.2.1 Beispiel: Umleitung mit 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.

40.2.3 3. Externe Umleitung

Sie können auch Umleitungen zu externen URLs durchführen, indem Sie das redirect:-Präfix mit einer vollständigen URL verwenden.

40.2.3.1 Beispiel: Externe Umleitung

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.

40.2.4 4. Verwendung von ResponseEntity für Umleitungen

In 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.

40.2.4.1 Beispiel: Umleitung mit ResponseEntity

import 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.

40.3 Arten von HTTP-Umleitungen

Es gibt verschiedene Arten von Umleitungen, die jeweils mit einem bestimmten HTTP-Statuscode verbunden sind. Hier sind die gebräuchlichsten:

40.3.1 Beispiel für Umleitungstypen

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

40.4 Best Practices für Umleitungen

  1. 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.

  2. Externe Umleitungen sparsam verwenden: Externe Umleitungen sollten nur verwendet werden, wenn dies notwendig ist, da sie den Benutzer aus der aktuellen Anwendung herausführen.

  3. 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.

  4. 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.

40.5 tl;dr

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.