亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

詳解java中spring里的三大攔截器

2024-07-14 08:42:40
字體:
來源:轉載
供稿:網友

Filter

新建 TimeFilter

@Componentpublic 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");  }}

啟動服務器,在瀏覽器輸入:http://localhost:8080/hello?name=tom

可以在控制臺輸出如下結果:

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

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

Interceptor

新建 TimeInterceptor

@Componentpublic 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;    // 獲取處理當前請求的 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();      // 只能獲取參數的名稱,不能獲取到參數的值      //System.out.println("parameterName: " + parameterName);    }     // 把當前時間放入 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 容器

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

啟動服務器,在瀏覽器輸入:http://localhost:8080/hello?name=tom

可以在控制臺輸出如下結果:

time filter starttime interceptor preHandlehandler 類:com.nextyu.demo.web.controller.HelloControllerhandler 方法:sayHelloname: tomtime interceptor postHandletime interceptor consume 40 mstime interceptor afterCompletiontime filter consume 51 mstime filter end

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

Aspcet

新建 TimeAspect

@Aspect@Componentpublic 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;  } }

啟動服務器,在瀏覽器輸入:http://localhost:8080/hello?name=tom

可以在控制臺輸出如下結果:

time filter starttime interceptor preHandlehandler 類:com.nextyu.demo.web.controller.HelloControllerhandler 方法:sayHellotime aspect startarg is tomname: tomtime aspect consume 0 mstime aspect endtime interceptor postHandletime interceptor consume 2 mstime interceptor afterCompletiontime filter consume 4 mstime filter end

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

請求攔截過程圖

graph TDhttprequest-->filterfilter-->interceptorinterceptor-->aspectaspect-->controller


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性videos高清精品| 韩国精品美女www爽爽爽视频| 亚洲成人av在线播放| 国产精品第一第二| 国a精品视频大全| 欧美又大又粗又长| 国产成人精品网站| 亚洲欧美国产精品久久久久久久| 一个人www欧美| 欧美激情亚洲激情| 国产精品私拍pans大尺度在线| 亚洲综合成人婷婷小说| 日本精品一区二区三区在线| 成人国内精品久久久久一区| 国产美女直播视频一区| 久久久久久高潮国产精品视| 日韩精品中文在线观看| 国产亚洲免费的视频看| 亚洲成人久久一区| 欧美亚洲日本黄色| 日韩欧美一区视频| 亚洲一区av在线播放| 亚洲一区二区免费在线| 国产亚洲日本欧美韩国| 亚洲成人久久一区| 4444欧美成人kkkk| 国产美女扒开尿口久久久| 久久久久久国产精品久久| 久久久成人的性感天堂| 国产成人综合久久| 国产美女久久精品| 欧美日韩一区二区三区在线免费观看| 精品视频在线播放免| 国产成人精品999| 亚洲 日韩 国产第一| 亚洲成av人影院在线观看| 欧美久久精品午夜青青大伊人| 91超碰中文字幕久久精品| 亚洲三级黄色在线观看| 久久99精品国产99久久6尤物| 久久久久久久亚洲精品| 亚洲欧美日韩精品久久奇米色影视| 欧美日韩中文字幕| 国产精品综合久久久| 欧美一区深夜视频| 国产精品视频久久久久| 欧美黄色免费网站| 精品国产电影一区| 欧美午夜xxx| 亚洲人成77777在线观看网| 粉嫩av一区二区三区免费野| 亚洲美女视频网| 亚洲人精品午夜在线观看| 成人av.网址在线网站| 欧美日韩国产在线播放| 激情久久av一区av二区av三区| 一区二区三区四区精品| 久久男人av资源网站| 久久电影一区二区| 国产午夜精品视频免费不卡69堂| 亚洲成人av在线播放| 爽爽爽爽爽爽爽成人免费观看| 亚洲国产黄色片| 亚洲视频精品在线| 欧美在线不卡区| 国产自产女人91一区在线观看| 欧美成人精品在线| 成人激情视频免费在线| 欧美日韩国产专区| 中文一区二区视频| 国产欧美日韩免费| 亚洲国内高清视频| 国产精品影院在线观看| 亚洲精品福利在线观看| 国产精品小说在线| 色无极影院亚洲| 国产不卡av在线免费观看| 成人免费网站在线| 欧美日韩一区二区三区在线免费观看| 精品久久中文字幕| 久久91亚洲精品中文字幕奶水| 亚洲精品国产精品乱码不99按摩| 国语自产精品视频在线看抢先版图片| 国产精品久久久久久久久久久久久| 成人在线视频福利| 青草成人免费视频| 亚洲乱码一区av黑人高潮| 视频一区视频二区国产精品| 欧美日韩人人澡狠狠躁视频| 国产日韩在线免费| 好吊成人免视频| 亚洲精品美女在线观看| 日韩欧美福利视频| 欧美性猛交xxxx免费看久久久| 亚洲国产精品成人av| 国产免费一区二区三区香蕉精| 国产视频丨精品|在线观看| 91av在线国产| 精品久久香蕉国产线看观看亚洲| 人人爽久久涩噜噜噜网站| 欧美激情一级欧美精品| 中文字幕免费精品一区| 亚洲国产成人久久综合| 777精品视频| 欧美精品videosex性欧美| 亚洲一区二区在线| 亚洲欧美国产制服动漫| 国产精品影片在线观看| 日本亚洲欧洲色α| 日韩欧美国产免费播放| 亚州精品天堂中文字幕| 久久亚洲精品国产亚洲老地址| 91sao在线观看国产| 日韩在线播放av| 久久精品中文字幕免费mv| 日韩免费黄色av| 亚洲成人黄色网址| 国产精品青青在线观看爽香蕉| 日韩国产一区三区| 亚洲女人天堂av| 国产精品视频色| 欧美制服第一页| 欧美与黑人午夜性猛交久久久| 国产日产欧美a一级在线| 亚洲精品成人av| 亚洲精品小视频在线观看| 久久天天躁狠狠躁夜夜av| 俺去啦;欧美日韩| 国产精品人人做人人爽| 国产女精品视频网站免费| 欧美专区在线视频| 欧美成人精品在线播放| 国产成人精品一区二区| 欧美日韩精品在线播放| 成人情趣片在线观看免费| 按摩亚洲人久久| 日韩精品视频三区| 欧美性做爰毛片| 日韩精品久久久久| 奇米成人av国产一区二区三区| 国产欧美精品日韩| 91视频九色网站| 亚洲香蕉成人av网站在线观看| 欧美亚洲第一页| 97人洗澡人人免费公开视频碰碰碰| 96精品视频在线| 亚洲激情 国产| 国产精品白嫩美女在线观看| 北条麻妃在线一区二区| 国产精品久久久久久久久久免费| 亚洲福利在线播放| 久久久伊人日本| 亚洲香蕉成视频在线观看| 亚洲美女www午夜| 国产精品中文在线| 成人免费网站在线观看| 国产精品久久久久久久天堂| 国产精品美女视频网站| 亚洲图片欧洲图片av| 久久网福利资源网站| 亚洲a级在线观看| 一区二区在线视频| 2019亚洲日韩新视频| 国产精品激情av在线播放|