主要分爲兩類,一是單個響應增加響應頭,而是對所有響應增加響應頭
單個響應
如果我們要在單個請求響應response增加header,可以使用httpServletResponse 或者 ResponseEntity objects.
Using HttpServletResponse
We simply have to add the HttpServletResponse object to our REST endpoint as an argument, then use the addHeader() method:
@GetMapping("/http-servlet-response")
public String usingHttpServletResponse(HttpServletResponse response) {
response.addHeader("Baeldung-Example-Header", "Value-HttpServletResponse");
return "Response with header using HttpServletResponse";
}
Using ResponseEntity
In this case, let's use the BodyBuilder provided by the ResponseEntity class:
@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");
}
所有響應
1. 通過Filter
Now let's imagine we want to set a particular header to many of our endpoints.
Of course, it would be frustrating if we have to replicate the previous code on each mapping methods.
A better approach to accomplish this is by configuring a Filter in our service:
@Component
public class AddResponseHeaderFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
FilterChain filterChain) throws ServletException, IOException {
httpServletResponse.addHeader("X-Frame-Options", "DENY");
httpServletResponse.addHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0");
httpServletResponse.addHeader("Cache-Control", "no-cache='set-cookie'");
httpServletResponse.addHeader("Pragma", "no-cache");
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
}
2.通過Interceptor
public class HttpResponseInterceptorHandler implements HandlerInterceptor {
// 實現HandlerInterceptor 或者 繼承HandlerInterceptorAdapter都可以,如果想看着簡潔就使用後者
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.addHeader("content-test","123");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
注意:1,在postHandle在添加header已經沒有意義 2,切記preHandle返回值一定要是true