关于“因为Interceptor只拦截Controller方法,所以要注意,返回ModelAndView后,后续对View的渲染就脱离了Interceptor的拦截范围。”的描述,源码中可以看到 DispatchServlet的执行顺序为先render后执行拦截器的 afterCompletion()
ModelAndView
private void processDispatchResult(HttpServletRequest request, HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception { boolean errorView = false; if (exception != null) { if (exception instanceof ModelAndViewDefiningException) { this.logger.debug("ModelAndViewDefiningException encountered", exception); mv = ((ModelAndViewDefiningException)exception).getModelAndView(); } else { Object handler = mappedHandler != null ? mappedHandler.getHandler() : null; mv = this.processHandlerException(request, response, handler, exception); errorView = mv != null; } } if (mv != null && !mv.wasCleared()) { //先渲染 this.render(mv, request, response); if (errorView) { WebUtils.clearErrorRequestAttributes(request); } } else if (this.logger.isTraceEnabled()) { this.logger.trace("No view rendering, null ModelAndView returned."); } if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) { if (mappedHandler != null) { //后执行拦截器的AfterCompletion mappedHandler.triggerAfterCompletion(request, response, (Exception)null); } }}
👍
Sign in to make a reply
2020-03_29
关于“因为Interceptor只拦截Controller方法,所以要注意,返回
ModelAndView
后,后续对View的渲染就脱离了Interceptor的拦截范围。”的描述,源码中可以看到 DispatchServlet的执行顺序为先render后执行拦截器的 afterCompletion()