1. 개요

이 빠른 사용방법(예제)에서는 Spring 5의 WebFlux 프레임워크 를 사용하여 반응하지 않는 엔드포인트 또는 API 에 대해 서비스 응답에 헤더를 설정하는 다양한 방법을 살펴 봅니다 .

이전 게시물 에서 이 프레임워크에 대한 추가 정보를 찾을 수 있습니다 .

2. 비반응성 구성 요소용 헤더

단일 응답에 헤더를 설정하려면 HttpServletResponse  또는 ResponseEntity 객체를 사용할 수 있습니다.

반대로 목표가 모든 응답 또는 여러 응답에 필터를 추가하는 것이라면 Filter 를 구성해야 합니다 .

2.1. HttpServletResponse 사용 

HttpServletResponse 개체를 REST Endpoints에 인수로 추가 한 다음 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  를 나타낼 수 있습니다

이 기사에서 지적했듯이 Spring에서 필터 를 검색할 수 있도록 하려면 @ServletComponentScan 어노테이션을 Spring 애플리케이션 클래스에 추가  해야  합니다  .

@ServletComponentScan
@SpringBootApplication
public class ResponseHeadersApplication {

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

@WebFilter 에서 제공하는 기능이 필요하지 않은 경우 필터 클래스 에서 @Component 어노테이션을 대신 사용하여 이 마지막 단계를 피할 수 있습니다 .

3. 반응형 엔드포인트용 헤더

이 섹션에서는 ServerHttpResponseResponseEntity  또는 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 사용 

마지막 두 하위 섹션에서 소개한 클래스 및 인터페이스는 @Controller  어노테이션 클래스에서 사용할 수 있지만 새로운 Spring 5 Functional Web Framework 에는 적합하지 않습니다 .

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. 결론

이 기사에서는 응답에 헤더를 설정하는 다양한 방법을 배웠습니다. 이제 단일 Endpoints에서 설정하거나 모든 나머지 API를 구성하거나 반응 스택으로 마이그레이션하려는 경우 필요한 지식이 있습니다.

항상 그렇듯이 비반응형 예제와 Spring 5 특정 기능 을 사용 하는 예제 모두 Github 리포지토리에서 모든 예제에 액세스할 수 있습니다 .

Generic footer banner