Discuss / Java / 拦截器可以在View渲染后执行拦截内容

拦截器可以在View渲染后执行拦截内容

Topic source

2020-03_29

#1 Created at ... [Delete] [Delete and Lock User]

关于“因为Interceptor只拦截Controller方法,所以要注意,返回ModelAndView后,后续对View的渲染就脱离了Interceptor的拦截范围。”的描述,源码中可以看到 DispatchServlet的执行顺序为先render后执行拦截器的 afterCompletion() 

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);        }    }}

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

👍


  • 1

Reply