<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      SpringMVC 攔截器原理

      歡迎光臨我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后臺(tái)使用Spring Boot

      前言

      SpringMVC 攔截器也是Aop(面向切面)思想構(gòu)建,但不是 Spring Aop 動(dòng)態(tài)代理實(shí)現(xiàn)的,
      主要采用責(zé)任鏈和適配器的設(shè)計(jì)模式來實(shí)現(xiàn),直接嵌入到 SpringMVC 入口代碼里面。
      

      流程分析

      瀏覽器請(qǐng)求
      
      DispatcherServlet 執(zhí)行調(diào)用 doService(request, response) 作為 Servlet 主要執(zhí)行者,
      doService(request, response) 通過調(diào)用 doDispatch(request, response) 來真正執(zhí)行請(qǐng)求處理
      
      doDispatch(request, response) 中完成攔截器的添加和攔截器攔截處理
          通過 getHandler(HttpServletRequest request) 獲取到 HandlerExecutionChain 處理器執(zhí)行鏈,
          將攔截器注入到 HandlerExecutionChain 的屬性中。
          分別調(diào)用 HandlerExecutionChain 的三個(gè)方法,applyPreHandle、applyPostHandle、triggerAfterCompletion,
          實(shí)現(xiàn)前置攔截/請(qǐng)求提交攔截和請(qǐng)求完成后攔截。
          使用責(zé)任鏈的設(shè)計(jì)模式,實(shí)際調(diào)用的是HandleInterceptor的三個(gè)接口,分別對(duì)應(yīng)preHandle、postHandle、afterCompletion
      

      HandlerExecutionChain 源碼分析

      public class HandlerExecutionChain {
      
          private final Object handler;
          @Nullable
          private HandlerInterceptor[] interceptors;
          @Nullable
          private List<HandlerInterceptor> interceptorList;
          private int interceptorIndex;
      
          /**
            按照列表中interceptor的順序來執(zhí)行它們的preHandle方法,直到有一個(gè)返回false。
            true:表示繼續(xù)流程(如調(diào)用下一個(gè)攔截器或處理器)
            返回false后:表示流程中斷(如登錄檢查失敗),不會(huì)繼續(xù)調(diào)用其他的攔截器或處理器,
            調(diào)用triggerAfterCompletion方法,此時(shí)this.interceptorIndex指向上一個(gè)返回true的interceptor的位置,
            所以它會(huì)按逆序執(zhí)行所有返回true的interceptor的afterCompletion方法。
          */
          boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
              HandlerInterceptor[] interceptors = this.getInterceptors();
              if (!ObjectUtils.isEmpty(interceptors)) {
                  for(int i = 0; i < interceptors.length; this.interceptorIndex = i++) {
                      HandlerInterceptor interceptor = interceptors[i];
                      if (!interceptor.preHandle(request, response, this.handler)) {
                          this.triggerAfterCompletion(request, response, (Exception)null);
                          return false;
                      }
                  }
              }
      
              return true;
          }
      
          /**
            按照逆序執(zhí)行所有interceptor的postHandle方法
          */
          void applyPostHandle(HttpServletRequest request, HttpServletResponse response, @Nullable ModelAndView mv) throws Exception {
              HandlerInterceptor[] interceptors = this.getInterceptors();
              if (!ObjectUtils.isEmpty(interceptors)) {
                  for(int i = interceptors.length - 1; i >= 0; --i) {
                      HandlerInterceptor interceptor = interceptors[i];
                      interceptor.postHandle(request, response, this.handler, mv);
                  }
              }
      
          }
      
          /**
            從最后一次preHandle成功的interceptor處逆序執(zhí)行afterCompletion方法。
          */
          void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, @Nullable Exception ex) throws Exception {
              HandlerInterceptor[] interceptors = this.getInterceptors();
              if (!ObjectUtils.isEmpty(interceptors)) {
                  for(int i = this.interceptorIndex; i >= 0; --i) {
                      HandlerInterceptor interceptor = interceptors[i];
      
                      try {
                          interceptor.afterCompletion(request, response, this.handler, ex);
                      } catch (Throwable var8) {
                          logger.error("HandlerInterceptor.afterCompletion threw exception", var8);
                      }
                  }
              }
      
          }
      }
      
      posted @ 2019-09-24 13:58  LittleDonkey  閱讀(3287)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 韩国无码AV片午夜福利| 亚洲小说乱欧美另类| 久热天堂在线视频精品伊人| 蜜桃av无码免费看永久| 亚洲欧美综合人成在线| 亚洲日本欧美日韩中文字幕| 国产精品亚洲А∨天堂免| 色播久久人人爽人人爽人人片av| 久久婷婷成人综合色| 福贡县| 天堂va欧美ⅴa亚洲va在线| 亚洲激情国产一区二区三区| 加勒比在线中文字幕一区二区| 无码国产偷倩在线播放老年人| 中文字幕无码视频手机免费看| 放荡的少妇2欧美版| 人摸人人人澡人人超碰97| 国产精品二区中文字幕| 国产精品毛片一区视频播| 免费国产精品黄色一区二区| 国产精品国产高清国产av| 5D肉蒲团之性战奶水欧美| 亚洲男人第一无码av网| 日韩中文字幕亚洲精品一| 国内不卡一区二区三区| 济南市| 国产一区二区黄色在线观看 | 亚洲色婷婷久久精品av蜜桃久久| 国产精品九九九一区二区| 在线a亚洲老鸭窝天堂| 国产成人精品无码播放| 国产日产免费高清欧美一区| 青草青草久热精品视频在线播放 | 亚洲av产在线精品亚洲第一站| 无码人妻aⅴ一区二区三区蜜桃| 乱人伦人妻中文字幕| 美腿丝袜亚洲综合第一页| 精品国产一区AV天美传媒| 国产午夜福利在线视频| 国产精品午夜福利导航导| 四虎网址|