天天看點

閱讀HandlerInterceptor接口源碼的了解

一、閱讀接口類注釋

二、閱讀preHandle()方法注釋

  Intercept the execution of a handler. Called after HandlerMapping determined an appropriate handler object, but before HandlerAdapter invokes the handler.

  了解:攔截一個handler處理器的執行。這個方法的調用時機:在映射處理器(HandlerMapping)指定合适的處理器對象之後,處理器擴充卡(HandlerAdapter)調用處理器之前。

  DispatcherServlet processes a handler in an execution chain, consisting of any number of interceptors, with the handler itself at the end. With this method, each interceptor can decide to abort the execution chain, typically sending a HTTP error or writing a custom response.

  了解:前端控制器調用一個處理器在一個執行鍊中(也就是說處理器和攔截器組成了一個執行鍊條),這個執行鍊條可以有任意個攔截器,但是handler(處理器)在這個執行鍊條的最後,即,先執行鍊條中的所有攔截器才執行處理器。通過這個方法,每一個攔截器都可以決定是否可以終止這個執行鍊條,通常發送一個HTTP錯誤或者一個自定義一個響應。

  注意:special considerations apply for asynchronous request processing. For more details see {@link org.springframework.web.servlet.AsyncHandlerInterceptor}.

三、閱讀postHandle()方法注釋

  Intercept the execution of a handler. Called after HandlerAdapter actually invoked the handler, but before the DispatcherServlet renders the view.

  了解:攔截一個處理的執行。這個方法的調用時機是:在處理器擴充卡調用處理器之後,但前端控制器渲染視圖之前。

  Can expose additional model objects to the view via the given ModelAndView.

  了解:可以通過給定的 ModelAndView 對象,暴露額外的模型對象給視圖。

四、閱讀afterCompletion()方法注釋

五、總結:

  每一個攔截器都有一個preHandle()方法和postHandle()方法。在調用處理器之前後,都會調用攔截器。由許多個攔截器組成一個執行鍊,而這個執行鍊是以數組的形式存在。是以,執行這個執行鍊的中的所有攔截器的preHandle()方法是按照interceptor[]數組的正序執行的,也就是按數組下标從小到大執行每一個攔截器的preHandle()方法。而攔截器的postHandle()方法的執行是按照逆序執行的,也就是按照interceptor[]數組的下标從大到小的順序執行攔截器中的postHandle()方法。而攔截器中的每一個afterCompletion()方法都是在渲染完視圖以後按照interceptor[]數組的下标從大到小的順序執行攔截器中的afterCompletion()方法,也就是說afterCompletion()方法的執行順序跟postHandle()方法的執行順序是一樣的。說這麼多還不如一張圖。如下圖:

閱讀HandlerInterceptor接口源碼的了解

 以上是正常情況下的執行順序,但是:當某一個攔截器的preHandle()方法()傳回false,那麼handler(處理器就不會執行)。它會直接去掉用目前攔截器的前一個攔截器的afterCompletion()方法,從這個方法開始逆序執行。比如:這裡的interceptor3的preHandle()方法傳回false。那麼就會直接調用interceptor2的afterCompletion()方法,并從這個方法開始逆序執行至結束。

閱讀HandlerInterceptor接口源碼的了解

轉載于:https://www.cnblogs.com/GooPolaris/p/7920375.html