乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      精盡Spring MVC源碼分析 - HandlerMapping 組件(二)之 HandlerInterceptor 攔截器

       行者花雕 2021-06-15

      該系列文檔是本人在學(xué)習(xí) Spring MVC 的源碼過(guò)程中總結(jié)下來(lái)的,可能對(duì)讀者不太友好,請(qǐng)結(jié)合我的源碼注釋 Spring MVC 源碼分析 GitHub 地址 進(jìn)行閱讀

      Spring 版本:5.1.14.RELEASE

      該系列其他文檔請(qǐng)查看:《精盡 Spring MVC 源碼分析 - 文章導(dǎo)讀》

      HandlerMapping 組件

      HandlerMapping 組件,請(qǐng)求的處理器匹配器,負(fù)責(zé)為請(qǐng)求找到合適的 HandlerExecutionChain 處理器執(zhí)行鏈,包含處理器(handler)和攔截器們(interceptors

      • handler 處理器是 Object 類型,可以將其理解成 HandlerMethod 對(duì)象(例如我們使用最多的 @RequestMapping 注解所標(biāo)注的方法會(huì)解析成該對(duì)象),包含了方法的所有信息,通過(guò)該對(duì)象能夠執(zhí)行該方法

      • HandlerInterceptor 攔截器對(duì)處理請(qǐng)求進(jìn)行增強(qiáng)處理,可用于在執(zhí)行方法前、成功執(zhí)行方法后、處理完成后進(jìn)行一些邏輯處理

      由于 HandlerMapping 組件涉及到的內(nèi)容比較多,考慮到內(nèi)容的排版,所以將這部分內(nèi)容拆分成了四個(gè)模塊,依次進(jìn)行分析:

      HandlerMapping 組件(二)之 HandlerInterceptor 攔截器

      在上一篇《HandlerMapping 組件(一)之 AbstractHandlerMapping》文檔中分析了 HandlerMapping 組件的 AbstractHandlerMapping 抽象類,在獲取HandlerExecutionChain 處理器執(zhí)行鏈時(shí),會(huì)去尋找匹配的 HandlerInterceptor 攔截器們,并添加到其中。那么本文將分享 Spring MVC 的攔截器相關(guān)內(nèi)容

      HandlerInterceptor

      org.springframework.web.servlet.HandlerInterceptor,處理器攔截器接口,代碼如下:

      public interface HandlerInterceptor {
      /**
       * 前置處理,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 執(zhí)行之前
       */
      default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
      
      return true;
      }
      
      /**
       * 后置處理,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 執(zhí)行成功之后
       */
      default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
      @Nullable ModelAndView modelAndView) throws Exception {
      }
      
      /**
       * 完成處理,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 執(zhí)行之后(無(wú)論成功還是失敗)
       * 條件:執(zhí)行 {@link #preHandle(HttpServletRequest, HttpServletResponse, Object)} 成功的攔截器才會(huì)執(zhí)行該方法
       */
      default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
      @Nullable Exception ex) throws Exception {
      }
      }

      HandlerExecutionChain

      org.springframework.web.servlet.HandlerExecutionChain,處理器執(zhí)行鏈,也就是通過(guò) HandlerMapping 組件為請(qǐng)求找到的處理對(duì)象,包含處理器(handler)和攔截器們(interceptors

      構(gòu)造方法

      public class HandlerExecutionChain {
      /**
       * 處理器
       */
      private final Object handler;
      
      /**
       * 攔截器數(shù)組
       */
      @Nullable
      private HandlerInterceptor[] interceptors;
      
      /**
       * 攔截器數(shù)組。
       *
       * 在實(shí)際使用時(shí),會(huì)調(diào)用 {@link #getInterceptors()} 方法,初始化到 {@link #interceptors} 中
       */
      @Nullable
      private List<HandlerInterceptor> interceptorList;
      
      /**
       * 已成功執(zhí)行 {@link HandlerInterceptor#preHandle(HttpServletRequest, HttpServletResponse, Object)} 的位置
       *
       * 在 {@link #applyPostHandle} 和 {@link #triggerAfterCompletion} 方法中需要用到,用于倒序執(zhí)行攔截器的方法
       */
      private int interceptorIndex = -1;
      
      public HandlerExecutionChain(Object handler) {
      this(handler, (HandlerInterceptor[]) null);
      }
      
      public HandlerExecutionChain(Object handler, @Nullable HandlerInterceptor... interceptors) {
      if (handler instanceof HandlerExecutionChain) {
      HandlerExecutionChain originalChain = (HandlerExecutionChain) handler;
      this.handler = originalChain.getHandler();
      this.interceptorList = new ArrayList<>();
      // 將原始的 HandlerExecutionChain 的 interceptors 復(fù)制到 this.interceptorList 中
      CollectionUtils.mergeArrayIntoCollection(originalChain.getInterceptors(), this.interceptorList);
      // 將入?yún)⒌?nbsp;interceptors 合并到 this.interceptorList 中
      CollectionUtils.mergeArrayIntoCollection(interceptors, this.interceptorList);
      } else {
      this.handler = handler;
      this.interceptors = interceptors;
      }
      }
      }
      • handler:請(qǐng)求對(duì)應(yīng)的處理器對(duì)象,可以先理解為 HandlerMethod 對(duì)象(例如我們常用的 @RequestMapping 注解對(duì)應(yīng)的方法會(huì)解析成該對(duì)象),也就是我們的某個(gè) Method 的所有信息,可以被執(zhí)行

      • interceptors:請(qǐng)求匹配的攔截器數(shù)組

      • interceptorList:請(qǐng)求匹配的攔截器集合,至于為什么要該屬性,我還沒(méi)看明白 

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多