Come impostare un'intestazione su una risposta con Spring 5

1. Panoramica

In questo breve tutorial, esamineremo diversi modi per impostare un'intestazione su una risposta del servizio , sia per gli endpoint non reattivi che per le API utilizzando il framework 5 WebFlux di Spring.

Possiamo trovare ulteriori informazioni su questo framework nei post precedenti.

2. Intestazioni per componenti non reattivi

Se vogliamo impostare intestazioni su singole risposte possiamo usare oggetti HttpServletResponse o ResponseEntity .

D'altra parte, se il nostro obiettivo è aggiungere un filtro a tutte o più risposte, dovremo configurare un filtro .

2.1. Utilizzando HttpServletResponse

Dobbiamo semplicemente aggiungere l' oggetto HttpServletResponse al nostro endpoint REST come argomento, quindi utilizzare il metodo addHeader () :

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

Come mostrato nell'esempio, non è necessario restituire l'oggetto risposta.

2.2. Utilizzo di ResponseEntity

In questo caso, usiamo il BodyBuilder fornito dalla classe 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"); }

La classe HttpHeaders offre numerosi metodi pratici per impostare le intestazioni più comuni.

Possiamo vedere altri esempi che illustrano questi punti nel nostro repository Github.

2.3. Aggiunta di un'intestazione per tutte le risposte

Ora immaginiamo di voler impostare una particolare intestazione per molti dei nostri endpoint.

Naturalmente, sarebbe frustrante se dovessimo replicare il codice precedente su ogni metodo di mappatura.

Un approccio migliore per ottenere ciò è configurare un filtro nel nostro servizio :

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

L' annotazione @WebFilter ci permette di indicare gli urlPatterns per i quali questo Filtro diventerà effettivo.

Come abbiamo sottolineato in questo articolo, per rendere il nostro filtro rilevabile da Spring, dobbiamo aggiungere l' annotazione @ServletComponentScan alla nostra classe Spring Application:

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

Possiamo evitare questo ultimo passaggio se non abbiamo bisogno di nessuna delle funzionalità fornite da @WebFilter , utilizzando invece l' annotazione @Component nella nostra classe Filter .

3. Intestazioni per endpoint reattivi

Di nuovo, vedremo come impostare le intestazioni sulle risposte di un singolo endpoint utilizzando le classi e le interfacce ServerHttpResponse , ResponseEntity o ServerResponse (per endpoint funzionali).

Impareremo anche come implementare un WebFilter Spring 5 per aggiungere un'intestazione a tutte le nostre risposte.

3.1. Utilizzando ServerHttpResponse

Questo approccio è abbastanza simile alla controparte 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. Utilizzo di ResponseEntity

Possiamo usare la classe ResponseEntity esattamente come facciamo per gli endpoint non reattivi:

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

The classes and interfaces introduced in the last two sub-sections can be used in @Controller annotated classes but are not suitable for the new Spring 5 Functional Web Framework.

If we want to set a header on a HandlerFunction then we'll need to get our hands on the ServerResponseinterface:

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. Adding a Header for All Responses

Lastly, Spring 5 provides a WebFilter interfaceto set a header on all the responses retrieved by a service:

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

In conclusione, abbiamo imparato molti modi diversi di impostare un'intestazione su una risposta, sia se vogliamo impostarla su un singolo endpoint sia se vogliamo configurare tutte le nostre API rimanenti, anche se stiamo migrando allo stack reattivo , ora abbiamo la conoscenza per fare tutte queste cose.

Come sempre, è possibile accedere a tutti gli esempi nel nostro repository Github, sia quelli non reattivi che quelli che utilizzano funzionalità specifiche di Spring 5.