Cara Menetapkan Header pada Respons dengan Spring 5

1. Ikhtisar

Dalam tutorial singkat ini, kita akan membahas berbagai cara untuk menyetel header pada respons layanan , baik untuk titik akhir non-reaktif atau untuk API yang menggunakan kerangka kerja 5 WebFlux Spring.

Kami dapat menemukan informasi lebih lanjut tentang kerangka ini di posting sebelumnya.

2. Header untuk Komponen Non-Reaktif

Jika kita ingin menyetel header pada tanggapan tunggal kita dapat menggunakan objek HttpServletResponse atau ResponseEntity .

Di sisi lain, jika tujuan kita adalah menambahkan filter ke semua atau beberapa tanggapan, kita perlu mengonfigurasi Filter .

2.1. Menggunakan HttpServletResponse

Kita hanya perlu menambahkan objek HttpServletResponse ke endpoint REST kita sebagai argumen, lalu gunakan metode addHeader () :

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

Seperti yang ditunjukkan pada contoh, kita tidak harus mengembalikan objek respons.

2.2. Menggunakan ResponseEntity

Dalam kasus ini, mari gunakan BodyBuilder yang disediakan oleh kelas ResponseEntity :

@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"); }

Kelas HttpHeaders menawarkan banyak metode praktis untuk menyetel header paling umum.

Kami dapat melihat lebih banyak contoh yang menggambarkan poin-poin ini di repo Github kami.

2.3. Menambahkan Header untuk Semua Respons

Sekarang mari kita bayangkan kita ingin mengatur tajuk tertentu ke banyak titik akhir kita.

Tentunya akan membuat frustasi jika kita harus mereplikasi kode sebelumnya pada setiap metode pemetaan.

Pendekatan yang lebih baik untuk mencapai ini adalah dengan mengonfigurasi Filter di layanan kami :

@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() { // ... } }

The @WebFilter penjelasan memungkinkan kita untuk menunjukkan urlPatterns yang ini Filter akan menjadi efektif.

Seperti yang telah kami tunjukkan di artikel ini, untuk membuat Filter kami dapat ditemukan oleh Spring, kami perlu menambahkan anotasi @ServletComponentScan ke kelas Aplikasi Spring kami:

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

Kita dapat menghindari langkah terakhir ini jika kita tidak memerlukan fungsionalitas apa pun yang disediakan oleh @WebFilter , dengan menggunakan anotasi @Component di kelas Filter kita .

3. Header untuk Titik Akhir Reaktif

Sekali lagi, kita akan melihat cara mengatur header pada respons titik akhir tunggal menggunakan kelas dan antarmuka ServerHttpResponse , ResponseEntity atau ServerResponse (untuk titik akhir fungsional).

Kami juga akan belajar bagaimana menerapkan WebFilter Spring 5 untuk menambahkan header pada semua tanggapan kami.

3.1. Menggunakan ServerHttpResponse

Pendekatan ini cukup mirip dengan mitra 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. Menggunakan ResponseEntity

Kita dapat menggunakan kelas ResponseEntity persis seperti yang kita lakukan untuk titik akhir non-reaktif:

@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. Menggunakan ServerResponse

Kelas dan antarmuka yang diperkenalkan dalam dua sub-bagian terakhir dapat digunakan dalam kelas beranotasi @Controller tetapi tidak cocok untuk Kerangka Web Fungsional Spring 5 yang baru.

Jika kita ingin mengatur header pada HandlerFunction maka kita harus mendapatkan antarmuka 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. Menambahkan Header untuk Semua Respons

Terakhir, Spring 5 menyediakan antarmuka WebFilteruntuk menyetel header pada semua tanggapan yang diambil oleh layanan:

@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. Kesimpulan

Kesimpulannya, kami telah mempelajari banyak cara berbeda untuk menyetel header pada respons, baik jika kami ingin menyetelnya pada satu titik akhir atau jika kami ingin mengonfigurasi semua API lainnya, bahkan jika kami bermigrasi ke tumpukan reaktif , sekarang kami memiliki pengetahuan untuk melakukan semua hal ini.

Seperti biasa, semua contoh dapat diakses di repositori Github kami, baik yang non-reaktif maupun yang menggunakan fungsionalitas khusus Spring 5.