天天看點

Filter如何工作

在 web.xml 檔案中通過<filter>和<filter-mapping>标簽組合對編寫的filter類進行注冊,并設定它所能攔截的資源

實際上,Filter可以完成與Serlvlet一樣的工作,甚至比Servlet使用起來更加靈活,因為它除了提供了request和response對象外,還提供了一個FiterChain鍊對象,他可以讓我們更加靈活地控制請求的流轉.

Filter如何工作

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如何工作

Filter執行時序圖

繼續閱讀