如果是@ResponseBody handler返回的response,在interceptor中无法再对response进行操作。
其response.isCommitted() == true
因为@ResponseBody是由HttpMessageConverter处理请求,写出到response,并设置为committed。
Specifically, the
@ResponseBody
is written and committed byServletHandlerMethodInvoker
beforeHandlerInterceptor.postHandle
is called. I would have expected the order to be similar to if I had omitted the@ResponseBody
and used aMarshallingView
instead, i.e.
HandlerInterceptor.preHandle
- (handler is invoked)
HandlerInterceptor.postHandle
- (response is written)
HandlerInterceptor.afterCompletion
With
@ResponseBody
, the 3rd and 4th steps are reversed.
原理探究
执行顺序:
- 先执行Controller
- 再执行returnValueHandler
- 执行ResponseBodyAdvice
- 执行HttpMessageConverter【此处HttpMessageConverter将response设置为了isCommitted】
- 执行HandlerIntercepter.postHandle()