天天看點

Filter過濾器

一、Filter過濾器

過濾器實際上就是對web資源進行攔截,做一些處理後再交給下一個過濾器或servlet處理。通常都是用來攔截request進行處理的,也可以對傳回的response進行攔截處理

Filter過濾器

二、應用場景

自動登入,統一設定編碼格式,通路權限控制,敏感字元過濾等

根據規範建議的各種類型的過濾器:

  1. 身份驗證過濾器(Authentication Filters)。
  2. 資料壓縮過濾器(Data compression Filters)。
  3. 加密過濾器(Encryption Filters)。
  4. 觸發資源通路事件過濾器。
  5. 圖像轉換過濾器(Image Conversion Filters)。
  6. 日志記錄和稽核過濾器(Logging and Auditing Filters)。
  7. MIME-TYPE 鍊過濾器(MIME-TYPE Chain Filters)。
  8. 标記化過濾器(Tokenizing Filters)。
  9. XSL/T 過濾器(XSL/T Filters),轉換 XML 内容。

過濾器通過 Web 部署描述符(web.xml)中的 XML 标簽來聲明,然後映射到您的應用程式的部署描述符中的 Servlet 名稱或 URL 模式。

當 Web 容器啟動 Web 應用程式時,它會為您在部署描述符中聲明的每一個過濾器建立一個執行個體。

Filter的執行順序與在web.xml配置檔案中的配置順序一緻,一般把Filter配置在所有的Servlet之前。

三、Filter過濾方法

過濾器是一個實作了 javax.servlet.Filter 接口的 Java 類。javax.servlet.Filter 接口定義了三個方法

1)public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

該方法完成實際的過濾操作,當用戶端請求方法與過濾器設定比對的URL時,Servlet容器将先調用過濾器的doFilter方法。

FilterChain使用者通路後續過濾器

2)public void init(FilterConfig fConfig)

web 應用程式啟動時,web 伺服器将建立Filter 的執行個體對象,并調用其init方法,讀取web.xml配置,完成對象的初始化功能。

進而為後續的使用者請求作好攔截的準備工作(filter對象隻會建立一次,init方法也隻會執行一次)。

開發人員通過init方法的參數,可獲得代表目前filter配置資訊的FilterConfig對象。

3)public void destroy()

Servlet容器在銷毀過濾器執行個體前調用該方法,在該方法中釋放Servlet過濾器占用的資源。

四、多個Filter的執行順序

在我們的請求到達Servle之間是可以經過多個Filter的,一般來說,建議Filter之間不要有關聯,各自處理各自的邏輯即可。這樣,我們也無需關心執行順序問題。

如果一定要確定執行順序,就要對配置進行修改了,執行順序如下:

① 在web.xml中,filter執行順序跟<filter-mapping>的順序有關,先聲明的先執行

② 使用注解配置的話,filter的執行順序跟名稱的字母順序有關,例如AFilter會比BFilter先執行

③ 如果既有在web.xml中聲明的Filter,也有通過注解配置的Filter,那麼會優先執行web.xml中配置的Filter

五、web.xml配置各節點說明

1)<filter>:指定一個過濾器

  • <filter-name>:用于為過濾器指定一個名字,該元素的内容不能為空。
  • <filter-class>:元素用于指定過濾器的完整的限定類名。
  • <init-param>:元素用于為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。

在過濾器中,可以使用 FilterConfig 接口對象來通路初始化參數。

2)<filter-mapping>:用于設定一個 Filter 所負責攔截的資源。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源通路的請求路徑

  • <filter-name>:子元素用于設定filter的注冊名稱。該值必須是在<filter>元素中聲明過的過濾器的名字
  • <url-pattern>:設定 filter 所攔截的請求路徑(過濾器關聯的URL樣式)

3)<servlet-name>:指定過濾器所攔截的Servlet名稱。

4)<dispatcher>:指定過濾器所攔截的資源被 Servlet 容器調用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,預設REQUEST。

使用者可以設定多個 <dispatcher> 子元素用來指定 Filter 對資源的多種調用方式進行攔截。

5)<dispatcher>子元素:可以設定的值及其意義

  • REQUEST:當使用者直接通路頁面時,Web容器将會調用過濾器。如果目标資源是通過RequestDispatcher的include()或forward()方法通路時,那麼該過濾器就不會被調用。
  • INCLUDE:如果目标資源是通過RequestDispatcher的include()方法通路時,那麼該過濾器将被調用。除此之外,該過濾器不會被調用。
  • FORWARD:如果目标資源是通過RequestDispatcher的forward()方法通路時,那麼該過濾器将被調用,除此之外,該過濾器不會被調用。
  • ERROR:如果目标資源是通過聲明式異常處理機制調用時,那麼該過濾器将被調用。除此之外,過濾器不會被調用。

六、XMl代碼展示

<!-- 注冊過濾器 -->
    <filter>
        <filter-name>EncodeFilter</filter-name>
        <filter-class>com.sikiedu.filter.EncodeFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter>
        <filter-name>AdminFilter</filter-name>
        <filter-class>com.sikiedu.filter.AdminFilter</filter-class>
    </filter>
    <!-- //注冊過濾器 -->
    
    <!-- 啟動過濾器 -->
    <filter-mapping>
        <filter-name>EncodeFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>AdminFilter</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
    <!-- //啟動過濾器 -->