Spring 5에서 응답에 헤더를 설정하는 방법

1. 개요

이 빠른 튜토리얼에서는 비 반응성 엔드 포인트 또는 Spring의 5 WebFlux 프레임 워크를 사용하는 API 에 대해 서비스 응답에 헤더를 설정하는 다양한 방법을 살펴볼 것 입니다.

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

2. 비 반응성 부품 용 헤더

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

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

2.1. HttpServletResponse 사용

REST 끝점에 HttpServletResponse 객체를 인수로 추가 한 다음 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 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에서 Filter를 검색 할 수 있도록하려면 Spring Application 클래스에 @ServletComponentScan 주석을 추가해야합니다 .

@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 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
    
      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에는 적합하지 않습니다.

우리가 원하는 경우 A의 헤더를 설정하는 HandlerFunction 우리는 우리의 손을 얻을해야합니다 ServerResponse의 인터페이스 :

public Mono 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 filter(ServerWebExchange exchange, WebFilterChain chain) { exchange.getResponse() .getHeaders() .add("Baeldung-Example-Filter-Header", "Value-Filter"); return chain.filter(exchange); } }

4. 결론

결론적으로, 단일 엔드 포인트에 헤더를 설정하거나 반응 스택으로 마이그레이션하는 경우에도 나머지 API를 모두 구성하려는 경우 응답에 헤더를 설정하는 다양한 방법을 배웠습니다. , 이제 우리는이 모든 일을 할 수있는 지식을 가지고 있습니다.

항상 그렇듯이 모든 예제는 Github 저장소에서 액세스 할 수 있습니다. 비 반응성 예제와 Spring 5 특정 기능을 사용하는 예제 모두입니다.