SpringBoot2.X自定義攔截器實戰及新舊配置對比(核心知識)


簡介: 講解攔截器使用,Spingboot2.x新版本配置攔截攔截器和舊版本SpringBoot配置攔截器區別講解

1、@Configuration
  繼承WebMvcConfigurationAdapter(SpringBoot2.X之前舊版本)

  SpringBoot2.X 新版本配置攔截器 implements WebMvcConfigurer

2、自定義攔截器 HandlerInterceptor
  preHandle:調用Controller某個方法之前
  postHandle:Controller之后調用,視圖渲染之前,如果控制器Controller出現了異常,則不會執行此方法
  afterCompletion:不管有沒有異常,這個afterCompletion都會被調用,用於資源清理

3、按照注冊順序進行攔截,先注冊,先被攔截

  攔截器不生效常見問題:
    1)是否有加@Configuration
    2)攔截路徑是否有問題 ** 和 *
    3)攔截器最后路徑一定要 “/**”, 如果是目錄的話則是 /*/

  Filter
    是基於函數回調 doFilter(),而Interceptor則是基於AOP思想
    Filter在只在Servlet前后起作用,而Interceptor夠深入到方法前后、異常拋出前后等

    依賴於Servlet容器即web應用中,而Interceptor不依賴於Servlet容器所以可以運行在多種環境。

    在接口調用的生命周期里,Interceptor可以被多次調用,而Filter只能在容器初始化時調用一次。

    Filter和Interceptor的執行順序

    過濾前->攔截前->action執行->攔截后->過濾后

代碼示例:

  CustomWebMvcConfigurer.java

 1 package net.xdclass.demo.intecpter;
 2 
 3 import org.springframework.context.annotation.Configuration;
 4 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 5 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 6 
 7 
 8 @Configuration
 9 public class CustomWebMvcConfigurer implements WebMvcConfigurer  {
10 
11     @Override
12     public void addInterceptors(InterceptorRegistry registry) {
13 
14         //'/*'匹配一個文件夾
15         registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api2/*/**");
16         registry.addInterceptor(new TwoIntercepter()).addPathPatterns("/api2/*/**");
17         
18         //.excludePathPatterns("/api2/xxx/**"); //攔截全部 /*/*/**
19         
20         WebMvcConfigurer.super.addInterceptors(registry);
21     }
22 
23     
24     
25     
26 
27 
28 }

LoginIntercepter.java:

 1 package net.xdclass.demo.intecpter;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 
 6 import org.springframework.web.servlet.HandlerInterceptor;
 7 import org.springframework.web.servlet.ModelAndView;
 8 
 9 public class LoginIntercepter implements HandlerInterceptor{
10 
11     /**
12      * 進入controller方法之前
13      */
14     @Override
15     public boolean preHandle(HttpServletRequest request,
16             HttpServletResponse response, Object handler) throws Exception {
17         System.out.println("LoginIntercepter------->preHandle");
18 
19 //        String token = request.getParameter("access_token");
20         
21 //        response.getWriter().print("fail");
22         
23         return HandlerInterceptor.super.preHandle(request, response, handler);
24     }
25 
26     /**
27      * 調用完controller之后,視圖渲染之前
28      */
29     @Override
30     public void postHandle(HttpServletRequest request,
31             HttpServletResponse response, Object handler,
32             ModelAndView modelAndView) throws Exception {
33         
34         System.out.println("LoginIntercepter------->postHandle");
35         
36         HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
37     }
38 
39     /**
40      * 整個完成之后,通常用於資源清理
41      */
42     @Override
43     public void afterCompletion(HttpServletRequest request,
44             HttpServletResponse response, Object handler, Exception ex)
45             throws Exception {
46         System.out.println("LoginIntercepter------->afterCompletion");
47         
48         HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
49     }
50 
51     
52     
53 }

TwoIntercepter.java:

 1 package net.xdclass.demo.intecpter;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 
 6 import org.springframework.web.servlet.HandlerInterceptor;
 7 import org.springframework.web.servlet.ModelAndView;
 8 
 9 public class TwoIntercepter implements HandlerInterceptor{
10 
11     /**
12      * 進入對應的controller方法之前
13      */
14     @Override
15     public boolean preHandle(HttpServletRequest request,
16             HttpServletResponse response, Object handler) throws Exception {
17 
18         System.out.println("TwoIntercepter------>preHandle");
19         return HandlerInterceptor.super.preHandle(request, response, handler);
20     }
21 
22     /**
23      * controller處理之后,返回對應的視圖之前
24      */
25     @Override
26     public void postHandle(HttpServletRequest request,
27             HttpServletResponse response, Object handler,
28             ModelAndView modelAndView) throws Exception {
29         System.out.println("TwoIntercepter------>postHandle");
30         HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
31     }
32 
33     /**
34      * 整個請求結束后調用,視圖渲染后,主要用於資源的清理
35      */
36     @Override
37     public void afterCompletion(HttpServletRequest request,
38             HttpServletResponse response, Object handler, Exception ex)
39             throws Exception {
40         System.out.println("TwoIntercepter------>afterCompletion");
41         HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
42     }
43 
44     
45 }

測試代碼:

瀏覽器訪問:http://localhost:8083/api2/v1/account

控制台查看:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM