{"id":467,"date":"2024-06-26T16:15:33","date_gmt":"2024-06-26T15:15:33","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=467"},"modified":"2024-07-04T16:19:04","modified_gmt":"2024-07-04T15:19:04","slug":"eigene-http-header-in-spring-6","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=467","title":{"rendered":"Eigene HTTP-Header in Spring 6"},"content":{"rendered":"\n<p>In einer modernen Webanwendung, die auf Spring 6 basiert, ist die Arbeit mit HTTP-Headern eine h\u00e4ufige Anforderung. Diese Header k\u00f6nnen n\u00fctzliche Informationen wie Authentifizierungstoken, Benutzerspezifische Daten oder Metadaten \u00fcber 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.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Grundlagen der HTTP-Header<\/h3>\n\n\n\n<p>HTTP-Header sind Schl\u00fcssel-Wert-Paare, die im Kopfbereich einer HTTP-Nachricht \u00fcbermittelt werden. Es gibt zwei Arten von Headern:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Request-Header:<\/strong> Diese werden vom Client gesendet und enthalten Informationen \u00fcber die Anfrage oder den Client selbst.<\/li>\n\n\n\n<li><strong>Response-Header:<\/strong> Diese werden vom Server gesendet und enthalten Informationen \u00fcber die Antwort.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. Lesen von eigenen Request-Headern<\/h3>\n\n\n\n<p>Um eigene Header aus einem HTTP-Request in einer Spring-Webanwendung zu lesen, gibt es mehrere Ans\u00e4tze. Die gebr\u00e4uchlichsten sind:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2.1. Verwendung von <code>@RequestHeader<\/code> Annotation<\/h4>\n\n\n\n<p>Die einfachste Methode, um Header in einem Spring Controller zu lesen, ist die Verwendung der <code>@RequestHeader<\/code> Annotation.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">org<\/span><span class=\"hljs-selector-class\">.springframework<\/span><span class=\"hljs-selector-class\">.web<\/span><span class=\"hljs-selector-class\">.bind<\/span><span class=\"hljs-selector-class\">.annotation<\/span><span class=\"hljs-selector-class\">.GetMapping<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">org<\/span><span class=\"hljs-selector-class\">.springframework<\/span><span class=\"hljs-selector-class\">.web<\/span><span class=\"hljs-selector-class\">.bind<\/span><span class=\"hljs-selector-class\">.annotation<\/span><span class=\"hljs-selector-class\">.RequestHeader<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">org<\/span><span class=\"hljs-selector-class\">.springframework<\/span><span class=\"hljs-selector-class\">.web<\/span><span class=\"hljs-selector-class\">.bind<\/span><span class=\"hljs-selector-class\">.annotation<\/span><span class=\"hljs-selector-class\">.RestController<\/span>;\n\n<span class=\"hljs-keyword\">@RestController<\/span>\npublic class MyController {\n\n    <span class=\"hljs-keyword\">@GetMapping<\/span>(\"\/read-header\")\n    public String readHeader(@RequestHeader(<span class=\"hljs-string\">\"X-My-Header\"<\/span>) String myHeader) {\n        <span class=\"hljs-selector-tag\">return<\/span> \"<span class=\"hljs-selector-tag\">Header<\/span> <span class=\"hljs-selector-tag\">Value<\/span>: \" + <span class=\"hljs-selector-tag\">myHeader<\/span>;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird der Wert des Headers <code>X-My-Header<\/code> gelesen und als String-Parameter in die Methode <code>readHeader<\/code> eingef\u00fcgt.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2.2. Zugriff auf alle Header mittels <code>HttpServletRequest<\/code><\/h4>\n\n\n\n<p>Manchmal ben\u00f6tigt man Zugriff auf alle Header oder m\u00f6chte Header dynamisch verarbeiten. Hier kann man <code>HttpServletRequest<\/code> verwenden.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> javax.servlet.http.HttpServletRequest;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.GetMapping;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyController<\/span> <\/span>{\n\n    @GetMapping(<span class=\"hljs-string\">\"\/read-all-headers\"<\/span>)\n    public <span class=\"hljs-built_in\">String<\/span> readAllHeaders(HttpServletRequest request) {\n        StringBuilder headers = <span class=\"hljs-keyword\">new<\/span> StringBuilder();\n        request.getHeaderNames().asIterator().forEachRemaining(headerName -&gt; {\n            headers.append(headerName).append(<span class=\"hljs-string\">\": \"<\/span>).append(request.getHeader(headerName)).append(<span class=\"hljs-string\">\"\\n\"<\/span>);\n        });\n        <span class=\"hljs-keyword\">return<\/span> headers.toString();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hier iterieren wir \u00fcber alle Header-Namen und bauen eine Zeichenkette mit allen Headern und ihren Werten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Setzen eigener Response-Header<\/h3>\n\n\n\n<p>Das Setzen von Response-Headern ist ebenfalls ein h\u00e4ufiger Anwendungsfall, z.B. f\u00fcr Caching-Informationen, Sicherheitsrichtlinien oder Metadaten. Spring bietet auch hier mehrere M\u00f6glichkeiten.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3.1. Verwendung von <code>HttpServletResponse<\/code><\/h4>\n\n\n\n<p>Der einfachste Weg, Response-Header zu setzen, ist die Verwendung von <code>HttpServletResponse<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">javax<\/span><span class=\"hljs-selector-class\">.servlet<\/span><span class=\"hljs-selector-class\">.http<\/span><span class=\"hljs-selector-class\">.HttpServletResponse<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">org<\/span><span class=\"hljs-selector-class\">.springframework<\/span><span class=\"hljs-selector-class\">.web<\/span><span class=\"hljs-selector-class\">.bind<\/span><span class=\"hljs-selector-class\">.annotation<\/span><span class=\"hljs-selector-class\">.GetMapping<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">org<\/span><span class=\"hljs-selector-class\">.springframework<\/span><span class=\"hljs-selector-class\">.web<\/span><span class=\"hljs-selector-class\">.bind<\/span><span class=\"hljs-selector-class\">.annotation<\/span><span class=\"hljs-selector-class\">.RestController<\/span>;\n\n<span class=\"hljs-keyword\">@RestController<\/span>\npublic class MyController {\n\n    <span class=\"hljs-keyword\">@GetMapping<\/span>(\"\/set-header\")\n    public String setHeader(HttpServletResponse response) {\n        <span class=\"hljs-selector-tag\">response<\/span><span class=\"hljs-selector-class\">.setHeader<\/span>(\"<span class=\"hljs-selector-tag\">X-My-Response-Header<\/span>\", \"<span class=\"hljs-selector-tag\">HeaderValue<\/span>\");\n        <span class=\"hljs-selector-tag\">return<\/span> \"<span class=\"hljs-selector-tag\">Header<\/span> <span class=\"hljs-selector-tag\">gesetzt<\/span>\";\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird ein eigener Header <code>X-My-Response-Header<\/code> mit dem Wert <code>HeaderValue<\/code> gesetzt.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3.2. Verwendung von <code>ResponseEntity<\/code><\/h4>\n\n\n\n<p><code>ResponseEntity<\/code> ist eine leistungsf\u00e4higere und flexiblere Methode, um den gesamten HTTP-Response zu konfigurieren.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> org.springframework.http.HttpHeaders;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.http.HttpStatus;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.http.ResponseEntity;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.GetMapping;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyController<\/span> <\/span>{\n\n    @GetMapping(<span class=\"hljs-string\">\"\/set-header-entity\"<\/span>)\n    public ResponseEntity&lt;<span class=\"hljs-built_in\">String<\/span>&gt; setHeaderWithEntity() {\n        HttpHeaders headers = <span class=\"hljs-keyword\">new<\/span> HttpHeaders();\n        headers.set(<span class=\"hljs-string\">\"X-My-Response-Header\"<\/span>, <span class=\"hljs-string\">\"HeaderValue\"<\/span>);\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ResponseEntity&lt;&gt;(<span class=\"hljs-string\">\"Header gesetzt mit ResponseEntity\"<\/span>, headers, HttpStatus.OK);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hier erstellen wir ein <code>HttpHeaders<\/code>-Objekt, setzen unseren Header und \u00fcbergeben es zusammen mit dem Response-Body und dem Status an <code>ResponseEntity<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Praktische Anwendung: Authentifizierung mittels Headern<\/h3>\n\n\n\n<p>Ein h\u00e4ufiges Szenario ist die Authentifizierung \u00fcber Header. Hierbei sendet der Client z.B. ein JWT (JSON Web Token) im <code>Authorization<\/code>-Header. Der Server muss diesen Header auslesen, validieren und gegebenenfalls benutzerdefinierte Header in der Antwort setzen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4.1. Lesen und Validieren eines JWT<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.GetMapping;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.RequestHeader;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.RestController;\n<span class=\"hljs-keyword\">import<\/span> io.jsonwebtoken.Claims;\n<span class=\"hljs-keyword\">import<\/span> io.jsonwebtoken.Jwts;\n<span class=\"hljs-keyword\">import<\/span> io.jsonwebtoken.security.Keys;\n\n<span class=\"hljs-keyword\">import<\/span> java.security.Key;\n\n@RestController\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AuthController<\/span> <\/span>{\n\n    private final Key key = Keys.secretKeyFor(io.jsonwebtoken.SignatureAlgorithm.HS256);\n\n    @GetMapping(<span class=\"hljs-string\">\"\/secure-endpoint\"<\/span>)\n    public <span class=\"hljs-built_in\">String<\/span> secureEndpoint(@RequestHeader(<span class=\"hljs-string\">\"Authorization\"<\/span>) <span class=\"hljs-built_in\">String<\/span> token) {\n        Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Hallo \"<\/span> + claims.getSubject();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird ein JWT aus dem <code>Authorization<\/code>-Header gelesen und validiert. Der Subject-Anspruch (z.B. der Benutzername) wird dann zur\u00fcckgegeben.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4.2. Setzen eines benutzerdefinierten Headers in der Antwort<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">javax<\/span><span class=\"hljs-selector-class\">.servlet<\/span><span class=\"hljs-selector-class\">.http<\/span><span class=\"hljs-selector-class\">.HttpServletResponse<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">org<\/span><span class=\"hljs-selector-class\">.springframework<\/span><span class=\"hljs-selector-class\">.web<\/span><span class=\"hljs-selector-class\">.bind<\/span><span class=\"hljs-selector-class\">.annotation<\/span><span class=\"hljs-selector-class\">.GetMapping<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">org<\/span><span class=\"hljs-selector-class\">.springframework<\/span><span class=\"hljs-selector-class\">.web<\/span><span class=\"hljs-selector-class\">.bind<\/span><span class=\"hljs-selector-class\">.annotation<\/span><span class=\"hljs-selector-class\">.RestController<\/span>;\n\n<span class=\"hljs-keyword\">@RestController<\/span>\npublic class AuthController {\n\n    <span class=\"hljs-keyword\">@GetMapping<\/span>(\"\/set-auth-header\")\n    public String setAuthHeader(HttpServletResponse response) {\n        <span class=\"hljs-selector-tag\">response<\/span><span class=\"hljs-selector-class\">.setHeader<\/span>(\"<span class=\"hljs-selector-tag\">X-Auth-Token<\/span>\", \"<span class=\"hljs-selector-tag\">neuerToken<\/span>\");\n        <span class=\"hljs-selector-tag\">return<\/span> \"<span class=\"hljs-selector-tag\">Neuer<\/span> <span class=\"hljs-selector-tag\">Auth-Token<\/span> <span class=\"hljs-selector-tag\">gesetzt<\/span>\";\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hier wird ein benutzerdefinierter Authentifizierungs-Header in der Antwort gesetzt, z.B. nach erfolgreicher Anmeldung oder Token-Aktualisierung.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Fazit<\/h3>\n\n\n\n<p>Die Arbeit mit HTTP-Headern in einer Spring 6 Webanwendung ist flexibel und kann auf verschiedene Arten umgesetzt werden. Durch die Verwendung von <code>@RequestHeader<\/code>, <code>HttpServletRequest<\/code> und <code>HttpServletResponse<\/code> oder <code>ResponseEntity<\/code> kann man einfach eigene Header lesen und setzen. Diese Techniken sind essenziell f\u00fcr moderne Webanwendungen, insbesondere wenn es um Authentifizierung, Sicherheit und benutzerdefinierte Metadaten geht. Indem man diese Methoden beherrscht, kann man die Funktionalit\u00e4t und Sicherheit seiner Anwendungen erheblich verbessern.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In einer modernen Webanwendung, die auf Spring 6 basiert, ist die Arbeit mit HTTP-Headern eine h\u00e4ufige Anforderung. Diese Header k\u00f6nnen n\u00fctzliche Informationen wie Authentifizierungstoken, Benutzerspezifische Daten oder Metadaten \u00fcber 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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-467","post","type-post","status-publish","format-standard","hentry","category-spring"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/467","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=467"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/467\/revisions"}],"predecessor-version":[{"id":468,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/467\/revisions\/468"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=467"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}