1. 程式人生 > >JavaWeb中filter的詳解及應用案例

JavaWeb中filter的詳解及應用案例

轉載自:http://www.cnblogs.com/vanl/p/5742501.html

一:Filter介紹

  Filter可認為是Servlet的一種“變種”,它主要用於對使用者請求(HttpServletRequest)進行預處理,也可以對伺服器響應(HttpServletResponse)進行後處理,是個典型的處理鏈。它與Servlet的區別在於:它不能直接向用戶生成響應。完整的流程是:Filter對使用者請求進行預處理,接著將請求交給Servlet進行處理並生成響應,最後Filter再對伺服器響應進行後處理。

二:Filter的幾個用處

  在HttpServletRequest到達Servlet之前,攔截客戶的HttpServletRequest。

  根據需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和資料。

  在HttpServletResponse到達客戶端之前,攔截HttpServletResponse。

  根據需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和資料。

三:Filter的種類

  使用者授權的Filter:Filter負責檢查使用者請求,根據請求過濾使用者非法請求。

  日誌Filter:詳細記錄某些特殊的使用者請求。

  負責解碼的Filter:包括對非標準編碼的請求解碼。

  Filter可攔截多個請求或響應;一個請求或響應也可被多個請求攔截。

四:Filter的應用例項

  建立一個Filter只需要兩個步驟:1.建立Filter處理類(如:MyFiletr)實現javax.servlet.Filter介面;2.web.xml中配置Filter

  4.1.簡單的記錄日誌的Filter,這個Filter負責攔截所符合條件的使用者請求,並將請求的資訊記錄在日誌中。

  

  

  web.xml配置資訊:

  

  總結:上面的程式實現了doFilter()方法,實現該方法就可以實現對使用者請求進行預處理,也可以實現對伺服器響應進行後處理--他們的分界線為是否呼叫了chain.doFilter(),執行該方法之前,即對使用者請求進行預處理;執行該方法之後,即對伺服器響應進行後處理。

  在上面的請求Filter中,僅在日誌中記錄請求的URL,對所有的請求都執行chain.doFilter (request,reponse)方法,當Filter對請求過濾後,依然將請求傳送到目的地址。如果需要檢查許可權,可以在Filter中根據使用者請求的HttpSession,判斷使用者許可權是否足夠。如果許可權不夠,直接呼叫重定向即可,無須呼叫chain.doFilter(request,reponse)方法。

  4.2.簡單的認證登入Filter。

  

  

  web.xml配置資訊:

  

  4.3.再次闡述Filter及一個應用小例子。

  Filter也稱之為過濾器,它是Servlet技術中比較激動人心的技術,WEB開發人員通過Filter技術,對web伺服器管理的所有web資源:例如Jsp, Servlet, 靜態圖片檔案或靜態 html 檔案等進行攔截,從而實現一些特殊的功能。例如實現URL級別的許可權訪問控制、過濾敏感詞彙、壓縮響應資訊等一些高階功能。

  Servlet API中提供了一個Filter介面,開發web應用時,如果編寫的Java類實現了這個介面,則把這個Java類稱之為過濾器Filter。通過Filter技術,開發人員可以實現使用者在訪問某個目標資源之前,對訪問的請求和響應進行攔截。簡單說,就是可以實現web容器對某資源的訪問前截獲進行相關的處理,還可以在某資源向web容器返回響應前進行截獲處理。

  

  web.xml配置資訊:

  

 

五:應用總結  

  Filter介面中有一個doFilter方法,當開發人員編寫好Filter類實現doFilter方法,並配置對哪個web資源進行攔截後,WEB伺服器每次在呼叫web資源的service方法之前(伺服器內部對資源的訪問機制決定的),都會先呼叫一下filter的doFilter方法。

  Filter的生命週期和Servlet一樣,Filter的建立和銷燬也是由WEB伺服器負責。不過與Servlet區別的是,它是1>在應用啟動的時候就進行裝載Filter類(與Servlet的load-on-startup配置效果相同)。2>容器建立好Filter物件例項後,呼叫init()方法。接著被Web容器儲存進應用級的集合容器中去了等待著,使用者訪問資源。3>當用戶訪問的資源正好被Filter的url-pattern攔截時,容器會取出Filter類呼叫doFilter方法,下次或多次訪問被攔截的資源時,Web容器會直接取出指定Filter物件例項呼叫doFilter方法(Filter物件常駐留Web容器了)。4>當應用服務被停止或重新裝載了,則會執行Filter的destroy方法,Filter物件銷燬。注意:init方法與destroy方法只會直接一次。
  Filter不僅可以通過url-pattern來指定攔截哪些url匹配的資源。而且還可以通過servlet-name來指定攔截哪個指定的servlet(專門為某個servlet服務了,servlet-name對應Servlet的相關配置)。