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

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

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

      spring里的三大攔截器

      Filter

      新建 TimeFilter

      @Component
      public class TimeFilter implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
              System.out.println("time filter init");
          }
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              System.out.println("time filter start");
              long startTime = System.currentTimeMillis();
      
              filterChain.doFilter(servletRequest, servletResponse);
      
              long endTime = System.currentTimeMillis();
              System.out.println("time filter consume " + (endTime - startTime) + " ms");
              System.out.println("time filter end");
          }
      
          @Override
          public void destroy() {
              System.out.println("time filter init");
          }
      }
      

      啟動(dòng)服務(wù)器,在瀏覽器輸入:http://localhost:8080/hello?name=tom
      可以在控制臺輸出如下結(jié)果:

      time filter start
      name: tom
      time filter consume 3 ms
      time filter end

      可以看到,filter 先執(zhí)行,再到真正執(zhí)行 HelloController.sayHello() 方法。
      通過 TimeFilter.doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 方法的參數(shù)可以看出,我們只能得到原始的 request 和 response對象,不能得到這個(gè)請求被哪個(gè) Controller 以及哪個(gè)方法處理了,使用Interceptor 就可以獲得這些信息。

      Interceptor

      新建 TimeInterceptor

      @Component
      public class TimeInterceptor extends HandlerInterceptorAdapter {
      
          private final NamedThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<>("startTimeThreadLocal");
      
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              System.out.println("time interceptor preHandle");
      
              HandlerMethod handlerMethod = (HandlerMethod) handler;
              // 獲取處理當(dāng)前請求的 handler 信息
              System.out.println("handler 類:" + handlerMethod.getBeanType().getName());
              // 方法名,方法注解,注解的值都可以獲取
              System.out.println("handler 方法:" + handlerMethod.getMethod().getName());
      
              MethodParameter[] methodParameters = handlerMethod.getMethodParameters();
              for (MethodParameter methodParameter : methodParameters) {
                  String parameterName = methodParameter.getParameterName();
                  // 只能獲取參數(shù)的名稱,不能獲取到參數(shù)的值
                  //System.out.println("parameterName: " + parameterName);
              }
      
              // 把當(dāng)前時(shí)間放入 threadLocal
              startTimeThreadLocal.set(System.currentTimeMillis());
      
              return true;
          }
      
          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
              System.out.println("time interceptor postHandle");
          }
      
          @Override
          public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
      
              // 從 threadLocal 取出剛才存入的 startTime
              Long startTime = startTimeThreadLocal.get();
              long endTime = System.currentTimeMillis();
      
              System.out.println("time interceptor consume " + (endTime - startTime) + " ms");
      
              System.out.println("time interceptor afterCompletion");
          }
      }
      

      注冊 TimeInterceptor
      把 TimeInterceptor 注入 spring 容器

      @Configuration
      public class WebConfig extends WebMvcConfigurerAdapter {
      
          @Autowired
          private TimeInterceptor timeInterceptor;
      
          @Override
          public void addInterceptors(InterceptorRegistry registry) {
              registry.addInterceptor(timeInterceptor);
          }
      }
      

      啟動(dòng)服務(wù)器,在瀏覽器輸入:http://localhost:8080/hello?name=tom
      可以在控制臺輸出如下結(jié)果:

      time filter start
      time interceptor preHandle
      handler 類:com.nextyu.demo.web.controller.HelloController
      handler 方法:sayHello
      name: tom
      time interceptor postHandle
      time interceptor consume 40 ms
      time interceptor afterCompletion
      time filter consume 51 ms
      time filter end
      

      可以看到,filter 先于 interceptor 執(zhí)行,再到真正執(zhí)行 HelloController.sayHello() 方法。通過 interceptor 方法上的 handler 參數(shù),我們就可以得到這個(gè)請求被哪個(gè) Controller 以及哪個(gè)方法處理了。但是不能直接獲取到這個(gè)方法上的參數(shù)值(在這里就是 HelloController.sayHello(String name) 方法參數(shù) name 的值),通過 Aspect 就可以獲取到。

      Aspcet

      新建 TimeAspect

      @Aspect
      @Component
      public class TimeAspect {
      
          @Around("execution(* com.nextyu.demo.web.controller.*.*(..))")
          public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
      
              System.out.println("time aspect start");
      
              Object[] args = pjp.getArgs();
              for (Object arg : args) {
                  System.out.println("arg is " + arg);
              }
      
              long startTime = System.currentTimeMillis();
      
              Object object = pjp.proceed();
      
              long endTime = System.currentTimeMillis();
              System.out.println("time aspect consume " + (endTime - startTime) + " ms");
      
              System.out.println("time aspect end");
      
              return object;
          }
      
      }
      

      啟動(dòng)服務(wù)器,在瀏覽器輸入:http://localhost:8080/hello?name=tom
      可以在控制臺輸出如下結(jié)果:

      time filter start
      time interceptor preHandle
      handler 類:com.nextyu.demo.web.controller.HelloController
      handler 方法:sayHello
      time aspect start
      arg is tom
      name: tom
      time aspect consume 0 ms
      time aspect end
      time interceptor postHandle
      time interceptor consume 2 ms
      time interceptor afterCompletion
      time filter consume 4 ms
      time filter end
      

      可以看到,filter 先執(zhí)行,再到 interceptor 執(zhí)行,再到 aspect 執(zhí)行,再到真正執(zhí)行 HelloController.sayHello() 方法。
      我們也獲取到了 HelloController.sayHello(String name) 方法參數(shù) name 的值

      請求攔截過程圖

      • Filter 可獲取原始http請求上下文
      • Interceptor 可獲取類和方法及方法注解元信息
      • Aspect 可獲取方法參數(shù)具體信息
      graph TD httprequest-->filter filter-->interceptor interceptor-->aspect aspect-->spring_method
      posted @ 2018-10-24 15:05  張占嶺  閱讀(2301)  評論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 午夜国产精品福利一二| 精品人伦一区二区三区蜜桃免费| 色噜噜狠狠成人综合| 国内精品视这里只有精品| 国产一级精品在线免费看| 四虎永久在线精品无码视频| 亚洲aⅴ男人的天堂在线观看 | 91福利视频一区二区| 午夜AAAAA级岛国福利在线| 国产一区二区日韩经典| julia无码中文字幕一区| 国产精品自在自线免费观看| 国产视频不卡一区二区三区| 国内精品视频区在线2021| 中国女人熟毛茸茸A毛片| 青青草久热这里只有精品| 亚欧乱色国产精品免费九库| 日韩国产成人精品视频| 毛多水多高潮高清视频| 免费无码观看的AV在线播放| 色综合中文综合网| 免费看一区无码无a片www| 男女xx00上下抽搐动态图| 久久精品噜噜噜成人av| 超清无码一区二区三区| 欧美 喷水 xxxx| 长子县| 丰满熟妇人妻中文字幕| 无码国模国产在线观看免费| 精品乱码一区二区三四五区| 久久99久久99精品免观看| 亚洲av中文久久精品国内| 亚洲精品一区久久久久一品av| 女人张开腿无遮无挡视频| 国产精品一区二区三区污| 91久久性奴调教国产免费| 丁香婷婷色综合激情五月| 国产精品黄在线观看免费| 欧美一级高清片久久99| 国产熟睡乱子伦视频在线播放| 国产精品成人网址在线观看|