往期推薦html
SpringBoot系列(一)idea新建Springboot項目java
springBoot系列(三)配置文件詳解spring
SpringBoot系列(五)Mybatis整合完整詳細版跨域
SpringBoot系列(六)集成thymeleaf詳解版數組
Springboot系列(七) 集成接口文檔swagger,使用,測試瀏覽器
SpringBoot系列(八)分分鐘學會Springboot多種解決跨域方式mvc
SpringBoot系列(九)單,多文件上傳的正確姿式app
SpringBoot系列(十)優雅的處理統一異常處理與統一結果返回
目錄
攔截器是在servlet執行以前執行的程序(這裏就是controller代碼執行以前),它主要是用於攔截用戶請求並做相應的處理,好比說能夠判斷用戶是否登陸,作相關的日誌記錄,也能夠作權限管理。
SpringBoot中的攔截器實現和spring mvc 中是同樣的,它的大體流程是,先本身定義一個攔截器類,並將這個類實現一個HandlerInterceptor類,或者是繼承HandlerInterceptorAdapter,均可以實現攔截器的定義。而後將本身定義的攔截器注入到適配器中,也有兩種方式,一種是實現WebMvcConfigurer接口,一種是繼承WebMvcConfigurerAdapter。下面咱們來看看如何完成。
直接上代碼,再進行一些代碼講解。
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("請求結束了"); } }
代碼說明:
@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/**")//攔截全部的路徑 .excludePathPatterns("/LoginController/login"); } }
代碼說明:
先建立一個登錄的測試,這個接口是不會攔截的。
@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"; } }
測試未攔截的接口,瀏覽器輸入:localhost:8097/LoginController/login,查看控制檯輸出狀況。
控制檯只輸出了未攔截接口內的代碼,說明這個接口是未攔截的。瀏覽器的顯示就無論了。其實通常是攔截登陸接口,這裏就將它放開了,以供測試。
測試攔截的接口,瀏覽器輸入:localhost:8097/hello/hello,查看控制檯輸出狀況。
能夠看到,首先是進入了攔截器,經過攔截器以後,進入了controller中的方法,執行完controller的代碼以後就進入了自定義攔截器中的postHandle方法,最後進入afterCompletion方法,並獲取到了一個response對象。
咱們能夠定義多個攔截器組成一個攔截器鏈。咱們能夠在適配器中注入多個攔截器。多加一行代碼就好了。
按照攔截器注入的順序,攔截器的執行順序應該是一下順序:攔截器1,攔截器2,攔截器2處理,攔截器1處理,攔截器2結束,攔截器1結束。對應三個過程的方法就是preHandle,postHandle,afterCompletion。
本文從攔截器的自定義到自定義適配器,而後將攔截器注入適配器,再到編寫測試代碼。準備工做完成以後就進行一個測試攔截器是否成功,最後擴展出攔截器鏈的一些內容。若是你以爲本文對你有用,三連走起!