Spring boot學習 (八) 之Interceptor(攔截器)的學習

前言

上一篇我們介紹了servlet、filter(過濾器)、listener(監聽器)spring-boot中的註冊,這次學習interceptor(攔截器)的運用。其實interceptor(攔截器)filter(過濾器)很相似,都用於攔截過濾請求,只是filterservlet範疇的,今天我們要學習的是Spring提供的HandlerInterceptor(攔截器),用到了其中比較重要的類:WebMvcConfigurer

正文

攔截器的學習

  • 創建自己的攔截器類並實現 HandlerInterceptor 接口
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("在請求處理之前進行調用");
        return true;//true纔會向下執行 false取消當前請求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

        System.out.println("請求處理之後進行調用");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {

        System.out.println("整個請求結束之後被調用");

    }
}

注:從這裏也可以看出來攔截器比過濾器更爲精細,在request被響應之前、request被響應之後、視圖渲染之前以及request全部結束之後都可以進行控制。雖然不能像filter一樣修改request的內容,但是可以通過拋出異常(或者返回false)來取消request的執行

  • 創建一個Java類(MyWebMvcConfigurer.java)繼承WebMvcConfigurer,並重寫 addInterceptors 方法。
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       
    }
}
  • 實例化我們自定義的攔截器(MyInterceptor ),將對像添加到addInterceptors方法中
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")
    }
}

執行過濾操作
在請求處理之前進行調用
請求處理之後進行調用
監聽器sessiom被創建
整個請求結束之後被調用

總結

只有經過DispatcherServletspring-boot默認爲"/*")的請求,纔會走攔截器鏈,我們自定義的Servlet 請求是不會被攔截的,比如我們自定義的Servlet地址 :http://localhost:8080/user/myservlet 是不會被攔截器攔截的,因爲他沒有經過DispatcherServlet 請求。下面這個是自定義的servlet,他不會走攔截器鏈

@WebServlet(urlPatterns="/user/*", description="說明")
public class MyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("》》》》》》doPost方法執行》》》》》》");

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("》》》》》》doGet方法執行》》》》》》");
        doPost(req, resp);
  }

}

原創作者:夢凌小樣
作品鏈接:https://www.jianshu.com/p/518ad8b10334【原創不易,轉載請註明出處,感謝理解】
一位愛生活,愛創作,愛分享,愛自己的90後女程序員一枚,記錄工作中的點點滴滴,一起學習,共同進步,期待能和優秀的您交上朋友

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章