springBoot 攔截器與過濾器

簡介

  • 過濾器
    依賴於servlet容器。在實現上基於函數回調,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器實例只能在容器初始化時調用一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取的數據,比如:在過濾器中修改字符編碼;在過濾器中修改HttpServletRequest的一些參數,包括:過濾低俗文字、危險字符等
  • 攔截器
    依賴於web框架,在SpringMVC中就是依賴於SpringMVC框架。在實現上基於Java的反射機制,屬於面向切面編程(AOP)的一種運用。由於攔截器是基於web框架的調用,因此可以使用Spring的依賴注入(DI)進行一些業務操作,同時一個攔截器實例在一個controller生命週期之內可以多次調用。
  • 過濾器攔截器運行先後步驟

在這裏插入圖片描述
springBoot使用過濾器

方法一 :使用FilterRegistrationBean ,這種方式過濾器中可以注入bean(前提setFilter 傳容器的bean,不是傳new的形式)
在這裏插入圖片描述
方法二:在過濾器上使用@WebFilter註解 需要在啓動類加@ServletComponentScan(basePackages="需要掃描的包")
使用@ServletComponentScan註解後 Servlet可以直接通過@WebServlet註解自動註冊
Filter可以直接通過@WebFilter註解自動註冊,Listener可以直接通過@WebListener 註解自動註冊

方法三:直接在過濾器上使用@Component註解(納入容器管理) 這種方式可以注入bean

注:方法二方式在部署到tomcat的時候即war部署(idea 內置的沒這種問題 即jar部署 java -jar xxx.war也沒問題)過濾器中不能注入bean,注入bean則會空指針異常

springBoot使用攔截器
在這裏插入圖片描述
注:1)過濾器和攔截器設置的時候filterRegistrationBean.setFilter(x)和registry.addInterceptor(x).addPathPatterns("/**")中的x 都可以用new 的形式,但是這樣攔截器和過濾器中注入的bean就會失敗,始終爲null,當x爲容器的bean則能解決過濾器和攔截器中無法注入bean的問題。
2)全局異常可以捕獲攔截器裏的異常,而不能捕獲過濾器裏的異常!

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