一、什麼是Filter攔截器
Javaweb中的過濾器可以攔截所有訪問web資源的請求或響應操作。
二、Filter配置
1.基本配置
<filter>
<filter-name>filter名稱</filter-name>
<filter-class>Filter類的包名.類名</filter-class>
</filter>
<filter-mapping>
<filter-name>filter名稱</filter-name>
<url-pattern>路徑</url-pattern>
</filter-mapping>
2.關於其它配置
1.<url-pattern>
完全匹配 以”/demo1”開始,不包含通配符*
目錄匹配 以”/”開始 以*結束擴展名匹配 *.xxx 不能寫成/*.xxx
2.<servlet-name>
它是對指定的servlet名稱的servlet進行攔截的。
3.<dispatcher>
可以取的值有 REQUEST FORWARD ERROR INCLUDE它的作用是:當以什麼方式去訪問web資源時,進行攔截操作.1.REQUEST 當是從瀏覽器直接訪問資源,或是重定向到某個資源時進行攔截方式配置的它也是默認值2.FORWARD 它描述的是請求轉發的攔截方式配置3.ERROR 如果目標資源是通過聲明式異常處理機制調用時,那麼該過濾器將被調用。除此之外,過濾器不會被調用。4.INCLUDE 如果目標資源是通過RequestDispatcher的include()方法訪問時,那麼該過濾器將被調用。除此之外,該過濾器不會被調用
三、FilterChain
FilterChain 是 servlet 容器爲開發人員提供的對象,它提供了對某一資源的已過濾請求調用鏈的視圖。過濾器使用 FilterChain 調用鏈中的下一個過濾器,如果調用的過濾器是鏈中的最後一個過濾器,則調用鏈末尾的資源。
問題:怎樣可以形成一個Filter鏈?
只要多個Filter對同一個資源進行攔截就可以形成Filter鏈
問題:怎樣確定Filter的執行順序?
由<filter-mapping>來確定
上圖先執行MyFilter過濾器,再執行MyFilter2過濾器。
MyFilter--MyFilter2
上圖先執行MyFilter2過濾器,再執行MyFilter過濾器。
MyFilter2--MyFilter
四、生命週期
1.Servlet生命週期:
實例化 --》初始化 --》服務 --》銷燬
2.Filter生命週期
l 當服務器啓動,會創建Filter對象,並調用init方法,只調用一次.
l 當訪問資源時,路徑與Filter的攔截路徑匹配,會執行Filter中的doFilter方法,這個方法是真正攔截操作的方法.
l 當服務器關閉時,會調用Filter的destroy方法來進行銷燬操作.
二者的主要區別在於Filter是在服務器啓動時就實例化和初始化,而Servlet是在初次訪問時才進行實例化和初始化
五、FilterConfig
在Filter的init方法上有一個參數,類型就是FilterConfig.
FilterConfig它是Filter的配置對象,它可以完成下列功能
1. 獲取Filtr名稱
2. 獲取Filter初始化參數
3. 獲取ServletContext對象。
怎樣在Filter中獲取一個FIlterConfig對象?