filter的原理(轉)


今天學習了一下javaweb開發中的Filter技術,於是在網上搜了一下相關資料,發現這篇博客寫的很不錯,於是希望能轉載過來以備以后繼續學習之用。(原:http://www.cnblogs.com/xdp-gacl/p/3948353.html)

filter是什么:

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

下面是j2ee API中介紹的用武之處:

  • Examples that have been identified for this design are:

    1. Authentication Filters (認證過濾器)
    2. Logging and Auditing Filters (日志和審計過濾器)
    3. Image conversion Filters (圖像轉換過濾器)
    4. Data compression Filters (數據壓縮過濾器)
    5. Encryption Filters (加密過濾器)
    6. Tokenizing Filters (分詞過濾器)
    7. Filters that trigger resource access events (觸發資源訪問控制時間過濾器)
    8. XSL/T filters
    9. Mime-type chain Filter  (內容類型過濾器)


  Servlet API中提供了一個Filter接口,開發web應用時,如果編寫的Java類實現了這個接口,則把這個java類稱之為過濾器Filter。通過Filter技術,開發人員可以實現用戶在訪問某個目標資源之前,對訪問的請求和響應進行攔截,如下所示:

filter是如何實現過濾的:

  Filter接口中有一個doFilter方法,當我們編寫好Filter,並配置對哪個web資源進行攔截后,WEB服務器每次在調用web資源的service方法之前,都會先調用一下filter的doFilter方法,因此,在該方法內編寫代碼可達到如下目的:

  1. 調用目標資源之前,讓一段代碼執行。
  2. 是否調用目標資源(即是否讓用戶訪問web資源)。
  3. 調用目標資源之后,讓一段代碼執行。

  web服務器在調用doFilter方法時,會傳遞一個filterChain對象進來,filterChain對象是filter接口中最重要的一個對 象,它也提供了一個doFilter方法,開發人員可以根據需求決定是否調用此方法,調用該方法,則web服務器就會調用web資源的service方 法,即web資源就會被訪問,否則web資源不會被訪問。

Filter鏈:

  在一個web應用中,可以開發編寫多個Filter,這些Filter組合起來稱之為一個Filter鏈。
  web服務器根據Filter在web.xml文件中的注冊順序,決定先調用哪個Filter,當第一個Filter的doFilter方法被調用時,web服務器會創建一個代表Filter鏈的FilterChain對象傳遞給該方法。在doFilter方法中,開發人員如果調用了FilterChain對象的doFilter方法,則web服務器會檢查FilterChain對象中是否還有filter,如果有,則調用第2個filter,如果沒有,則調用目標資源。

Filter的生命周期(與Servlet類似):

  Filter的創建:

    Filter的創建和銷毀由WEB服務器負責。 web 應用程序啟動,web 服務器將創建Filter 的實例對象,並調用其init方法,完成對象的初始化功能,從而為后續的用戶請求作好攔截的准備工作filter對象只會創建一次,init方法也只會執行一次。通過init方法的參數,可獲得代表當前filter配置信息的FilterConfig對象。

  Filter的銷毀:

    Web容器調用destroy方法銷毀Filter。destroy方法在Filter的生命周期中僅執行一次。在destroy方法中,可以釋放過濾器使用的資源。

  FilterConfig接口:

    用戶在配置filter時,可以使用<init-param>為filter配置一些初始化參數,當web容器實例化Filter對象,調用其init方法時,會把封裝了filter初始化參數的filterConfig對象傳遞進來。因此開發人員在編寫filter時,通過filterConfig對象的方法,就可獲得:
  String getFilterName():得到filter的名稱。
  String getInitParameter(String name): 返回在部署描述中指定名稱的初始化參數的值。如果不存在返回null.
  Enumeration getInitParameterNames():返回過濾器的所有初始化參數的名字的枚舉集合。
  public ServletContext getServletContext():返回Servlet上下文對象的引用。

Filter的部署(2步):

  1.注冊Filter(在web.xml文件中注冊)

  2.映射Filter(在web.xml文件中進行映射)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM