Spring春風拂面系列---SpringBoot 設置response header的方法總結

主要分爲兩類,一是單個響應增加響應頭,而是對所有響應增加響應頭

單個響應

如果我們要在單個請求響應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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章