知識庫 / Spring / Spring Web RSS 訂閱

設置響應頭的方法(Spring)

Spring Web
HongKong
4
01:46 PM · Dec 06 ,2025

1. 概述

本快速教程將探討在服務響應中設置標題的不同方法,無論您是使用非反應式端點還是 API,都將使用 Spring 5 的 WebFlux 框架

您可以在之前的文章中找到有關此框架的更多信息。

2. 非響應式組件的標題

如果我們要為單個響應設置標題,可以使用 <em >HttpServletResponse</em><em >ResponseEntity</em> 對象。

相反,如果我們要為所有或多個響應添加過濾器,則需要配置 <em >Filter</em>

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

在這種情況下,我們將使用 BodyBuilder,該 ResponseEntity 類提供:

@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 類提供了許多便捷的方法來設置最常見的 HTTP 頭部。

您可以在 我們的 GitHub 倉庫 中找到更多示例,説明這些點。

2.3. 為所有響應添加標題

現在,讓我們假設我們想要為許多端點設置特定的標題。

當然,如果我們在每個映射方法中都必須複製先前代碼,這將會令人沮喪。

採用一種更好的方法是在我們的服務中配置一個 過濾器 < /strong>:

@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” 註解允許我們指定該 Filter 將生效的 urlPatterns

正如我們在本文中提到的,為了使我們的 Filter 可被 Spring 發現,我們需要將 @ServletComponentScan 註解添加到我們的 Spring Application 類中:

@ServletComponentScan
@SpringBootApplication
public class ResponseHeadersApplication {

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

如果我們不需要 @WebFilter 提供的任何功能,我們可以通過在我們的 @Component 註解中定義 @Component,從而避免最後一步。

3. 反應式端點的標題

本節將學習如何使用 <em >ServerHttpResponse</em><em >ResponseEntity</em><em >ServerResponse</em> (用於函數式端點) 類和接口,設置單端點響應的標題。

我們還將討論如何實現一個 Spring <em >WebFilter</em>,以便在所有響應上添加標題。

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 泛型 Web 框架。

如果我們想在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. 結論

在本文中,我們學習了多種設置響應頭部的不同方法。無論我們是想為單個端點設置頭,配置所有 REST API,還是遷移到響應式棧,我們都擁有了必要的知識。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.