Spring Boot過濾器詳解

Spring中的過濾器

一. 配置方法及其特點

 1. 方法一
 1)步驟:

 ①. 新建類實現實現Filter接口,實現接口的抽象方法:init、doFilter、destroy(init,destroy有默認實現,一般實現doFilter方法就好
 ②. 爲新建類添加註解@WebFilter(urlPatterns = “/*”, filterName = “logFilter”)

@WebFilter(urlPatterns = "/*", filterName = "webSecurityFilter")
public class WebSecurityFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 
    	FilterChain filterChain) throws IOException, ServletException {
        //TODO
        filterChain.doFilter(httpServletRequest, httpServletResponse);
    }

}

 ③. 在啓動類上添加過濾器包掃描註解@ServletComponentScan(“com.xlt.filter”),或者直接在步驟②中爲每個過濾器添加@Component註解,兩者效果是一樣的

@SpringBootApplication(scanBasePackages = "com.xlt")
@ServletComponentScan("com.xlt.filter")
public class DemoWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoWebApplication.class, args);
    }
}

 2)特點:

 ①. 這種配置方法無法顯式指定過濾器的執行順序,不過我們能通過編輯過濾器類名來決定其執行順序(先後順序爲數字由小到大,字母由A-Z)
附:StackOverFlow連接

 3)備註:

 ①. 若在步驟③中,兩個註解同時添加,且@WebFilter註解的filterName屬性恰好是首字母小寫的類名時,則會有導致Bean重名的情況,這樣做也沒有什麼意義,只不過是把一個過濾器分別以兩個不同的名字,添加了兩遍到過濾器鏈中

 2. 方法二
 1)步驟:

 ①. 使用配置類,添加@Configuration註解
 ②. 添加過濾器註冊bean
 ③. 註冊過濾器並配置屬性

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean filterRegistration2() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new WebSecurityFilter());
        registration.addUrlPatterns("/*");
        registration.setName("webSecurityFilter");
        registration.setOrder(1);
        return registration;
    }
}
 2)特點:

 ①. 該配置方式中我們可以通過過濾器註冊Bean的setOrder方法顯示指定過濾起的執行順序(數字小的先執行)
 ②. 項目中其他地方並不會用到過濾器實例,所有在該種配置方式中,我們可以用內部類的方式來定義過濾器
附:Java內部類
 ③. 該配置方式中我們手動實例化過濾器,並指定其各屬性,所以過濾器類就不要任何註解來修飾

 3. 方法三
 1)步驟:

 ①.通過xml文件配置(不過spring boot一般沒有web.xml)

  <filter>  
      <filter-name>FilterTest</filter-name>  
      <filter-class>com.xlt.filter.WebSecurityFilter</filter-class>  
  </filter>  
  <!--映射過濾器-->  
  <filter-mapping>  
      <filter-name>webSecurityFilter</filter-name>  
      <!--“/*”表示攔截所有的請求 -->  
      <url-pattern>/*</url-pattern>  
  </filter-mapping>
 2)特點:

 ①. 該種配置方式過濾器的執行先後順序由在web.xml中由上到下的位置決定

二. 過濾器鏈

 1. 每個過濾器doFilter方法的參數列表都有一個FilterChain參數,其表示Spring容器中所有過濾器的一個變長列表,每次在過濾器中調用FilterChain.doFilter()方法,都會調用變長列表中的下一個過濾器的doFilter方法
 2. 執行順序

 過濾器doFilter方法中,參數FilterChain調用doFilter方法表示調用過濾器鏈中下一個過濾器,所以每個過濾器doFilter方法中的代碼都分爲兩部分,過濾前,和過濾後,以FilterChain調用doFiter爲界限,過濾器鏈中這兩部分的執行順序爲,以過濾器鏈中先入順序爲主:過濾器一過濾前,過濾器二過濾前,調用controller層,service層,數據庫,然後執行過濾器二過濾後,過濾器一過濾後:
在這裏插入圖片描述

三. 總結

 1.過濾器與攔截器的區別

 ①. Filter是依賴於Servlet容器,屬於Servlet規範的一部分,而攔截器則是獨立存在的,可以在任何情況下使用

 ②. Filter的執行由Servlet容器回調完成,而攔截器通常通過動態代理的方式來執行。

 ③. Filter的生命週期由Servlet容器管理,而攔截器則可以通過IoC容器來管理,因此可以通過注入等方式來獲取其他Bean的實例,因此使用會更方便。

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