Spring 5でレスポンスにヘッダーを設定する方法
1. 概要
このクイックチュートリアルでは、非リアクティブエンドポイントまたはSpring’s 5 WebFlux frameworkを使用するAPIのいずれかのwe’ll go through different ways of setting a header on a service responseを使用します。
このフレームワークの詳細については、previous postsを参照してください。
2. 非反応コンポーネントのヘッダー
単一の応答にヘッダーを設定する場合は、HttpServletResponseまたはResponseEntityオブジェクトを使用できます。
一方、目的がすべてまたは複数の応答にフィルターを追加することである場合は、Filterを構成する必要があります。
2.1. HttpServletResponseの使用
HttpServletResponseオブジェクトを引数としてRESTエンドポイントに追加してから、addHeader()メソッドを使用するだけです。
@GetMapping("/http-servlet-response")
public String usingHttpServletResponse(HttpServletResponse response) {
response.addHeader("example-Example-Header", "Value-HttpServletResponse");
return "Response with header using HttpServletResponse";
}
例に示すように、応答オブジェクトを返す必要はありません。
2.2. ResponseEntityの使用
この場合、ResponseEntityクラスによって提供されるBodyBuilderを使用しましょう。
@GetMapping("/response-entity-builder-with-http-headers")
public ResponseEntity usingResponseEntityBuilderAndHttpHeaders() {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("example-Example-Header",
"Value-ResponseEntityBuilderWithHttpHeaders");
return ResponseEntity.ok()
.headers(responseHeaders)
.body("Response with header using ResponseEntity");
}
HttpHeadersクラスは、最も一般的なヘッダーを設定するための便利なメソッドを多数提供します。
これらのポイントをour Github repoで示す他の例を見ることができます。
2.3. すべての応答にヘッダーを追加する
ここで、特定のヘッダーを多くのエンドポイントに設定したいとします。
もちろん、各マッピングメソッドで以前のコードを複製する必要がある場合、イライラするでしょう。
これを達成するためのより良いアプローチは、configuring a Filter in our serviceによるものです。
@WebFilter("/filter-response-header/*")
public class AddResponseHeaderFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setHeader(
"example-Example-Filter-Header", "Value-Filter");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// ...
}
@Override
public void destroy() {
// ...
}
}
@WebFilterアノテーションを使用すると、このFilter が有効になるurlPatterns を示すことができます。
in this articleを指摘したように、SpringでFilterを検出できるようにするには、Spring Applicationクラスに@ServletComponentScan annotationを追加する必要があります。
@ServletComponentScan
@SpringBootApplication
public class ResponseHeadersApplication {
public static void main(String[] args) {
SpringApplication.run(ResponseHeadersApplication.class, args);
}
}
Filterクラスで@Componentアノテーションを使用することで、@WebFilterが提供する機能が不要な場合は、この最後の手順を回避できます。
3. 反応性エンドポイントのヘッダー
ここでも、ServerHttpResponse、ResponseEntity 、またはServerResponse(機能エンドポイントの場合)のクラスとインターフェースを使用して、単一エンドポイントの応答にヘッダーを設定する方法を説明します。
また、Spring 5WebFilterを実装して、すべての応答にヘッダーを追加する方法についても学習します。
3.1. ServerHttpResponseの使用
このアプローチは、HttpServletResponseのカウンターパートとかなり似ています。
@GetMapping("/server-http-response")
public Mono usingServerHttpResponse(ServerHttpResponse response) {
response.getHeaders().add("example-Example-Header", "Value-ServerHttpResponse");
return Mono.just("Response with header using ServerHttpResponse");
}
3.2. ResponseEntityの使用
非反応性エンドポイントの場合とまったく同じように、ResponseEntityクラスを使用できます。
@GetMapping("/response-entity")
public Mono> usingResponseEntityBuilder() {
String responseHeaderKey = "example-Example-Header";
String responseHeaderValue = "Value-ResponseEntityBuilder";
String responseBody = "Response with header using ResponseEntity (builder)";
return Mono.just(ResponseEntity.ok()
.header(responseHeaderKey, responseHeaderValue)
.body(responseBody));
}
3.3. ServerResponseの使用
最後の2つのサブセクションで紹介したクラスとインターフェイスは、@Controller annotatedクラスで使用できますが、新しいSpring 5 Functional Web Frameworkには適していません。
to set a header on a HandlerFunction then we’ll need to get our hands on the ServerResponseインターフェースが必要な場合:
public Mono useHandler(final ServerRequest request) {
return ServerResponse.ok()
.header("example-Example-Header", "Value-Handler")
.body(Mono.just("Response with header using Handler"),String.class);
}
3.4. すべての応答にヘッダーを追加する
最後に、サービスによって取得されたSpring 5 provides a WebFilter interface to set a header on all the responses:
@Component
public class AddResponseHeaderWebFilter implements WebFilter {
@Override
public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
exchange.getResponse()
.getHeaders()
.add("example-Example-Filter-Header", "Value-Filter");
return chain.filter(exchange);
}
}
4. 結論
結論として、単一のエンドポイントにヘッダーを設定する場合、またはリアクティブスタックに移行する場合でも、残りのすべてのAPIを構成する場合のいずれかで、応答にヘッダーを設定するさまざまな方法を学びました。 、これで、これらすべてのことを行うための知識が得られました。
いつものように、すべての例は、non-reactive onesとSpring 5 specific functionalityを使用したものの両方のGithubリポジトリでアクセスできます。