如果是@ResponseBody handler返回的response,在interceptor中无法再对response进行操作。
其response.isCommitted() == true
因为@ResponseBody是由HttpMessageConverter处理请求,写出到response,并设置为committed。

Specifically, the @ResponseBody is written and committed by ServletHandlerMethodInvoker before HandlerInterceptor.postHandle is called. I would have expected the order to be similar to if I had omitted the @ResponseBody and used a MarshallingView instead, i.e.

  • HandlerInterceptor.preHandle
  • (handler is invoked)
  • HandlerInterceptor.postHandle
  • (response is written)
  • HandlerInterceptor.afterCompletion

With @ResponseBody, the 3rd and 4th steps are reversed.

原理探究

image.png
执行顺序:

  1. 先执行Controller
  2. 再执行returnValueHandler
    1. 执行ResponseBodyAdvice
    2. 执行HttpMessageConverter【此处HttpMessageConverter将response设置为了isCommitted
  3. 执行HandlerIntercepter.postHandle()