SpringBoot系列(十一)攔截器與攔截器鏈的配置與使用詳解,你知道多少?

往期推薦html

SpringBoot系列(一)idea新建Springboot項目java

SpringBoot系列(二)入門知識web

springBoot系列(三)配置文件詳解spring

SpringBoot系列(四)web靜態資源配置詳解後端

SpringBoot系列(五)Mybatis整合完整詳細版跨域

SpringBoot系列(六)集成thymeleaf詳解版數組

Springboot系列(七) 集成接口文檔swagger,使用,測試瀏覽器

SpringBoot系列(八)分分鐘學會Springboot多種解決跨域方式mvc

SpringBoot系列(九)單,多文件上傳的正確姿式app

SpringBoot系列(十)優雅的處理統一異常處理與統一結果返回

目錄

1. 攔截器介紹

 攔截器是在servlet執行以前執行的程序(這裏就是controller代碼執行以前),它主要是用於攔截用戶請求並做相應的處理,好比說能夠判斷用戶是否登陸,作相關的日誌記錄,也能夠作權限管理。

 SpringBoot中的攔截器實現和spring mvc 中是同樣的,它的大體流程是,先本身定義一個攔截器類,並將這個類實現一個HandlerInterceptor類,或者是繼承HandlerInterceptorAdapter,均可以實現攔截器的定義。而後將本身定義的攔截器注入到適配器中,也有兩種方式,一種是實現WebMvcConfigurer接口,一種是繼承WebMvcConfigurerAdapter。下面咱們來看看如何完成。

2.自定義攔截器

直接上代碼,再進行一些代碼講解。

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("進入攔截器了");
        //中間寫邏輯代碼,好比判斷是否登陸成功,失敗則返回false
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        //
        System.out.println("controller 執行完了");
    }


    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("我獲取到了一個返回的結果:"+response);
        System.out.println("請求結束了");
    }
}

代碼說明:

  1. 自定義的攔截器能夠實現HandlerInterceptor接口,也能夠繼承HandlerInterceptorAdapter類。
  2. 重寫三個方法,固然也能夠只實現一個最重要的preHandle方法。
  3. preHandle方法:此方法會在進入controller以前執行,返回Boolean值決定是否執行後續操做。
  4. postHandle方法:此方法將在controller執行以後執行,可是視圖尚未解析,可向ModelAndView中添加數據(先後端不分離的)。
  5. afterCompletion方法:該方法會在整個請求結束(請求結束,可是並未返回結果給客戶端)以後執行, 可獲取響應數據及異常信息。

3.攔截器注入適配器

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**")//攔截全部的路徑
                .excludePathPatterns("/LoginController/login");
    }
}

代碼說明:

  1. 經過實現WebMvcConfigurer接口能夠自定義一個適配器,也能夠經過繼承WebMvcConfigurerAdapter來定義適配器,建議使用第一種,第二種已是過期的方法了。
  2. 重寫addInterceptors方法,addInterceptor方法是將攔截器注入到適配器中。
  3. addPathPatterns方法是設置一個須要攔截的路徑,能夠是多個字符串或者是直接傳入一個數組。
  4. excludePathPatterns是配置不須要攔截的路徑。
  5. 須要加上configuration註解說明這是一個配置類,在項目啓動的時候自動執行。

4.controller測試

 先建立一個登錄的測試,這個接口是不會攔截的。

@RestController
@RequestMapping("LoginController")
public class Login {
    @RequestMapping("/login")
    public String login(){
        System.out.println("controller開始執行");
        return "login success";
    }
}

 建立一個攔截的controller

@RestController
@RequestMapping("/hello")
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("通過攔截的controller代碼執行完畢");
        return "hello";
    }
}

5. 測試

  1. 測試未攔截的接口,瀏覽器輸入:localhost:8097/LoginController/login,查看控制檯輸出狀況。

    控制檯只輸出了未攔截接口內的代碼,說明這個接口是未攔截的。瀏覽器的顯示就無論了。其實通常是攔截登陸接口,這裏就將它放開了,以供測試。

  2. 測試攔截的接口,瀏覽器輸入:localhost:8097/hello/hello,查看控制檯輸出狀況。

    能夠看到,首先是進入了攔截器,經過攔截器以後,進入了controller中的方法,執行完controller的代碼以後就進入了自定義攔截器中的postHandle方法,最後進入afterCompletion方法,並獲取到了一個response對象。

6. 擴展內容:攔截器鏈

 咱們能夠定義多個攔截器組成一個攔截器鏈。咱們能夠在適配器中注入多個攔截器。多加一行代碼就好了。

 按照攔截器注入的順序,攔截器的執行順序應該是一下順序:攔截器1,攔截器2,攔截器2處理,攔截器1處理,攔截器2結束,攔截器1結束。對應三個過程的方法就是preHandle,postHandle,afterCompletion

7. 總結

 本文從攔截器的自定義到自定義適配器,而後將攔截器注入適配器,再到編寫測試代碼。準備工做完成以後就進行一個測試攔截器是否成功,最後擴展出攔截器鏈的一些內容。若是你以爲本文對你有用,三連走起!

相關文章
相關標籤/搜索