在 web.xml 檔案中通過<filter>和<filter-mapping>标簽組合對編寫的filter類進行注冊,并設定它所能攔截的資源
實際上,Filter可以完成與Serlvlet一樣的工作,甚至比Servlet使用起來更加靈活,因為它除了提供了request和response對象外,還提供了一個FiterChain鍊對象,他可以讓我們更加靈活地控制請求的流轉.
Filter相關的類結構圖
在Tomcat中,FilterConfig和FilterChain的實作類分别是從ApplicationFilterConfig和ApplcationFIterChian,而Fitler
的實作類由使用者自定義,隻要實作了FIlter接口中定義的三個接口即可,這三個接口與在Servlet中的類似.隻不過還有一個AlllicationFilterChain類,此類可以将多個Filter串聯成鍊.
詳細看下Filter中的三個接口方法
- init<FilterConfig>:初始化接口,在使用者自定義的Filter初始化時被調用,它與Servlet的init方法作用一緻,FilterCongfig與ServletConfig也類似,除了都能取到容器的環境類ServletContext對象之外,還能擷取在<filter>下配置的<init-param>參數值
- doFilter(ServletRequest,ServResponse,FilterChain):在每個使用者的請求進來時都會調用此方法,并在Servlet的service方法前被調用,而FilterChjain就代表目前的整個請求鍊,是以通過調用doFilter可以将請求繼續傳遞下去.若想攔截此請求,可不調用doFilter,那麼該請求就直接反悔了,是以Filter是一種責任鍊設計模式.
- destroy:當Filter對象被銷毀時,該方法被調用.注意:當Web容器調用該方法後,容器就會再調用一次doFilter方法.
Filter類的核心哈市傳遞的FilterChain對象,該對象儲存了到最終Servlet對象的所有Filter對象,這些對象都儲存在ApplicationFilterChain對象的filters數組中.在FilterChain鍊上每執行一個Filter對象,數組的目前計數加一,直到計數等于數組的長度,當FilterChain上所有的Filter對象執行完成後,就會執行最終的Servl.是以在ApplicationFilterChain對象中會持有Servle對象的引用
Filter執行時序圖