In einer modernen Webanwendung, die auf Spring 6 basiert, ist die Arbeit mit HTTP-Headern eine häufige Anforderung. Diese Header können nützliche Informationen wie Authentifizierungstoken, Benutzerspezifische Daten oder Metadaten über den Client und die Anfrage enthalten. In diesem Artikel werden wir detailliert besprechen, wie man eigene Header aus HTTP-Requests liest und eigene Response-Header setzt.

1. Grundlagen der HTTP-Header

HTTP-Header sind Schlüssel-Wert-Paare, die im Kopfbereich einer HTTP-Nachricht übermittelt werden. Es gibt zwei Arten von Headern:

  • Request-Header: Diese werden vom Client gesendet und enthalten Informationen über die Anfrage oder den Client selbst.
  • Response-Header: Diese werden vom Server gesendet und enthalten Informationen über die Antwort.

2. Lesen von eigenen Request-Headern

Um eigene Header aus einem HTTP-Request in einer Spring-Webanwendung zu lesen, gibt es mehrere Ansätze. Die gebräuchlichsten sind:

2.1. Verwendung von @RequestHeader Annotation

Die einfachste Methode, um Header in einem Spring Controller zu lesen, ist die Verwendung der @RequestHeader Annotation.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/read-header")
    public String readHeader(@RequestHeader("X-My-Header") String myHeader) {
        return "Header Value: " + myHeader;
    }
}Code-Sprache: CSS (css)

In diesem Beispiel wird der Wert des Headers X-My-Header gelesen und als String-Parameter in die Methode readHeader eingefügt.

2.2. Zugriff auf alle Header mittels HttpServletRequest

Manchmal benötigt man Zugriff auf alle Header oder möchte Header dynamisch verarbeiten. Hier kann man HttpServletRequest verwenden.

import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/read-all-headers")
    public String readAllHeaders(HttpServletRequest request) {
        StringBuilder headers = new StringBuilder();
        request.getHeaderNames().asIterator().forEachRemaining(headerName -> {
            headers.append(headerName).append(": ").append(request.getHeader(headerName)).append("\n");
        });
        return headers.toString();
    }
}Code-Sprache: JavaScript (javascript)

Hier iterieren wir über alle Header-Namen und bauen eine Zeichenkette mit allen Headern und ihren Werten.

3. Setzen eigener Response-Header

Das Setzen von Response-Headern ist ebenfalls ein häufiger Anwendungsfall, z.B. für Caching-Informationen, Sicherheitsrichtlinien oder Metadaten. Spring bietet auch hier mehrere Möglichkeiten.

3.1. Verwendung von HttpServletResponse

Der einfachste Weg, Response-Header zu setzen, ist die Verwendung von HttpServletResponse.

import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/set-header")
    public String setHeader(HttpServletResponse response) {
        response.setHeader("X-My-Response-Header", "HeaderValue");
        return "Header gesetzt";
    }
}Code-Sprache: CSS (css)

In diesem Beispiel wird ein eigener Header X-My-Response-Header mit dem Wert HeaderValue gesetzt.

3.2. Verwendung von ResponseEntity

ResponseEntity ist eine leistungsfähigere und flexiblere Methode, um den gesamten HTTP-Response zu konfigurieren.

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/set-header-entity")
    public ResponseEntity<String> setHeaderWithEntity() {
        HttpHeaders headers = new HttpHeaders();
        headers.set("X-My-Response-Header", "HeaderValue");
        return new ResponseEntity<>("Header gesetzt mit ResponseEntity", headers, HttpStatus.OK);
    }
}Code-Sprache: JavaScript (javascript)

Hier erstellen wir ein HttpHeaders-Objekt, setzen unseren Header und übergeben es zusammen mit dem Response-Body und dem Status an ResponseEntity.

4. Praktische Anwendung: Authentifizierung mittels Headern

Ein häufiges Szenario ist die Authentifizierung über Header. Hierbei sendet der Client z.B. ein JWT (JSON Web Token) im Authorization-Header. Der Server muss diesen Header auslesen, validieren und gegebenenfalls benutzerdefinierte Header in der Antwort setzen.

4.1. Lesen und Validieren eines JWT

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import java.security.Key;

@RestController
public class AuthController {

    private final Key key = Keys.secretKeyFor(io.jsonwebtoken.SignatureAlgorithm.HS256);

    @GetMapping("/secure-endpoint")
    public String secureEndpoint(@RequestHeader("Authorization") String token) {
        Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
        return "Hallo " + claims.getSubject();
    }
}Code-Sprache: JavaScript (javascript)

In diesem Beispiel wird ein JWT aus dem Authorization-Header gelesen und validiert. Der Subject-Anspruch (z.B. der Benutzername) wird dann zurückgegeben.

4.2. Setzen eines benutzerdefinierten Headers in der Antwort

import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AuthController {

    @GetMapping("/set-auth-header")
    public String setAuthHeader(HttpServletResponse response) {
        response.setHeader("X-Auth-Token", "neuerToken");
        return "Neuer Auth-Token gesetzt";
    }
}Code-Sprache: CSS (css)

Hier wird ein benutzerdefinierter Authentifizierungs-Header in der Antwort gesetzt, z.B. nach erfolgreicher Anmeldung oder Token-Aktualisierung.

5. Fazit

Die Arbeit mit HTTP-Headern in einer Spring 6 Webanwendung ist flexibel und kann auf verschiedene Arten umgesetzt werden. Durch die Verwendung von @RequestHeader, HttpServletRequest und HttpServletResponse oder ResponseEntity kann man einfach eigene Header lesen und setzen. Diese Techniken sind essenziell für moderne Webanwendungen, insbesondere wenn es um Authentifizierung, Sicherheit und benutzerdefinierte Metadaten geht. Indem man diese Methoden beherrscht, kann man die Funktionalität und Sicherheit seiner Anwendungen erheblich verbessern.