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,還是遷移到響應式棧,我們都擁有了必要的知識。