1. 概要

このクイックチュートリアルでは、非リアクティブエンドポイントまたはSpringの5WebFluxフレームワークを使用するAPIのいずれかで、サービス応答にヘッダーを設定するさまざまな方法を説明します。 ]。

このフレームワークの詳細については、以前の投稿をご覧ください。

2. 非反応性コンポーネントのヘッダー

単一の応答にヘッダーを設定する場合は、HttpServletResponseまたはResponseEntityオブジェクトを使用できます。

一方、すべてまたは複数の応答にフィルターを追加することが目的の場合は、フィルターを構成する必要があります。

2.1. HttpServletResponseを使用する

HttpServletResponse オブジェクトを引数としてRESTエンドポイントに追加し、 addHeader()メソッドを使用するだけです。

@GetMapping("/http-servlet-response")
public String usingHttpServletResponse(HttpServletResponse response) {
    response.addHeader("Baeldung-Example-Header", "Value-HttpServletResponse");
    return "Response with header using HttpServletResponse";
}

例に示されているように、応答オブジェクトを返す必要はありません。

2.2. ResponseEntityを使用する

この場合、ResponseEntityクラスによって提供されるBodyBuilderを使用しましょう。

@GetMapping("/response-entity-builder-with-http-headers")
public ResponseEntity<String> usingResponseEntityBuilderAndHttpHeaders() {
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("Baeldung-Example-Header", 
      "Value-ResponseEntityBuilderWithHttpHeaders");

    return ResponseEntity.ok()
      .headers(responseHeaders)
      .body("Response with header using ResponseEntity");
}

HttpHeaders クラスは、最も一般的なヘッダーを設定するための便利なメソッドを多数提供します。

これらのポイントを示す他の例は、Githubリポジトリで確認できます。

2.3. すべての応答のヘッダーを追加する

ここで、特定のヘッダーを多くのエンドポイントに設定したいとします。

もちろん、各マッピングメソッドで前のコードを複製する必要がある場合はイライラします。

これを実現するためのより良いアプローチは、サービスでフィルターを構成することです

@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(
          "Baeldung-Example-Filter-Header", "Value-Filter");
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // ...
    }

    @Override
    public void destroy() {
        // ...
    }
}

@WebFilter アノテーションを使用すると、このフィルターが有効になるurlPatternsを示すことができます。 

この記事を指摘したように、 Filter をSpringで検出できるようにするには、@ServletComponentScanアノテーションを追加する必要があります。 Springアプリケーションクラス:

@ServletComponentScan
@SpringBootApplication
public class ResponseHeadersApplication {

    public static void main(String[] args) {
        SpringApplication.run(ResponseHeadersApplication.class, args);
    }
}

@WebFilter によって提供される機能が必要ない場合は、代わりにFilterクラスで@Componentアノテーションを使用することで、この最後の手順を回避できます。 。

3. リアクティブエンドポイントのヘッダー

ここでも、 ServerHttpResponse ResponseEntity 、または ServerResponse (機能エンドポイントの場合)クラスとインターフェイスを使用して、単一エンドポイント応答にヘッダーを設定する方法を説明します。

また、Spring 5 WebFilter を実装して、すべての応答にヘッダーを追加する方法についても学習します。

3.1. ServerHttpResponseを使用する

このアプローチは、HttpServletResponseの対応するものとかなり似ています。

@GetMapping("/server-http-response")
public Mono<String> usingServerHttpResponse(ServerHttpResponse response) {
    response.getHeaders().add("Baeldung-Example-Header", "Value-ServerHttpResponse");
    return Mono.just("Response with header using ServerHttpResponse");
}

3.2. ResponseEntityを使用する

ResponseEntity クラスは、非リアクティブエンドポイントの場合とまったく同じように使用できます。

@GetMapping("/response-entity")
public Mono<ResponseEntity<String>> usingResponseEntityBuilder() {
    String responseHeaderKey = "Baeldung-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 注釈付きクラスで使用できますが、新しい Spring 5 Functional WebFrameworkには適していません。

でHandlerFunctionにヘッダーを設定する場合は、ServerResponseインターフェイスを入手する必要があります。

public Mono<ServerResponse> useHandler(final ServerRequest request) {
     return ServerResponse.ok()
        .header("Baeldung-Example-Header", "Value-Handler")
        .body(Mono.just("Response with header using Handler"),String.class);
}

3.4. すべての応答のヘッダーを追加する

最後に、 Spring 5は、サービスによって取得されたすべての応答にヘッダーを設定するためのWebFilterインターフェースを提供します。

@Component
public class AddResponseHeaderWebFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        exchange.getResponse()
          .getHeaders()
          .add("Baeldung-Example-Filter-Header", "Value-Filter");
        return chain.filter(exchange);
    }
}

4. 結論

結論として、単一のエンドポイントにヘッダーを設定する場合、またはリアクティブスタックに移行する場合でも、残りのすべてのAPIを構成する場合は、応答にヘッダーを設定するさまざまな方法を学びました。 、今、私たちはこれらすべてのことを行うための知識を持っています。

いつものように、すべての例は、非反応性のものSpring5固有の機能を使用するものの両方のGithubリポジトリでアクセスできます。