JavaWeb三大組件——過濾器的運行機制理解


過濾器Filter

  文章前言:本文側重實用和理解。

一.過濾器的概念。

  lFilter也稱之為過濾器,它是Servlet技術中最實用的技術,WEB開發人員通過Filter技術,對web服務器管理的所有web資源:例如Jsp, Servlet, 靜態圖片文件或靜態 html 文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮響應信息等一些高級功能。
 
二.過濾器的運行機制。
   沒有加Filter的web項目運行機制如下:
    加上Filter的web運行機制:
  由此可見:Filter的作用就是綠色網站,保護網站,實現訪問權限的控制等等。
三.怎樣實現一個Filter。
  •   編寫一個類實現Filter接口了。
  •   配置Filter
  <!-- 配置過濾器 -->
  <filter>
  	<!-- 過濾器名稱 -->
  	<filter-name>FilterDemo1</filter-name>
  	<!-- 過濾器的類的全路徑 -->
  	<filter-class>cn.itcast.filter.FilterDemo1</filter-class>
  </filter>
  
  <!-- 配置過濾器映射 -->
  <filter-mapping>
  	<!-- 過濾器名稱 -->
  	<filter-name>FilterDemo1</filter-name>
  	<!-- 過濾器路徑 -->
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

  

  <filter-name>用於為過濾器指定一個名字,該元素的內容不能為空。
  <filter-class>元素用於指定過濾器的完整的限定類名。

    <init-param>元素用於為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數

  <url-pattern>標簽的配置:

    * 完全路徑匹配 :以 / 開始的. 如 /aa  /bb /aa/bb...

    * 目錄匹配    :以 / 開始的. 以 * 結束.如 /* /aa/* /aa/bb/*

    * 擴展名匹配  :不能以 / 開始的. 如 *.jsp  *.do  *.action

  配置Filter之后,在服務器調用Servlet之前,會自動尋找與自身路徑相匹配的過濾器路徑,匹配之后,則執行過濾器。無匹配,則直接調用Servlet。

四.過濾器鏈的概念。

  通常客戶端對服務器請求之后,服務器調用Servlet之前會執行一組過濾器(多個過濾器),那么這組過濾器就稱為一條過濾器鏈。

    每個過濾器實現某個特定的功能,一個過濾器檢測多個Servlet。(匹配幾個,檢測幾個)。

  一組過濾器中的執行順序與<filter-mapping>的配置順序呢有關。

  當第一個Filter的doFilter方法被調用時,web服務器會創建一個代表Filter鏈的FilterChain對象傳遞給該方法。在doFilter方法中,開發人員如果調用了FilterChain對象的doFilter方法,則web服務器會檢查FilterChain對象中是否還有filter,如果有,則調用第2個filter,如果沒有,則調用目標資源。

五.過濾器的生命周期。
  
  生命周期圖:
  
  三種方法:
  
   linit(FilterConfig filterConfig)throws ServletException:
    和我們編寫的Servlet程序一樣,Filter的創建和銷毀由WEB服務器負責。 web 應用程序啟動時,web 服務器將創建Filter 的實例對象,並調用其init方法進行初始化(注:filter對象只會創建一次,init方也只會執行一次 )。
    開發人員通過init方法的參數,可獲得代表當前filter配置信息的FilterConfig對象。(filterConfig對象見下頁PPT)ldoFilter(ServletRequest,ServletResponse,FilterChain)每次filter進行攔截都會執行在實際開發中方法中參數request和response通常轉換為HttpServletRequest和HttpServletResponse類型進行操作。
  
   doFilter(ServletRequest,ServletResponse,FilterChain):
    每次filter進行攔截都會執行。
    在實際開發中方法中參數request和response通常轉換為HttpServletRequest和HttpServletResponse類型進行操作。
 
   destroy():
    在Web容器卸載 Filter 對象之前被調用。
六.過濾器鏈的運行機制。
  
  分析運行機制:
  •    Filter里面的doFilter是Filter實例的doFilter(request,response)方法。
  •  這條責任鏈的運行次序依次是:代碼1,代碼3,代碼5,Servelt、web資源..,代碼6,代碼4,代碼2;就是因為它的頭尾相呼應的機制,所以才叫它責任鏈。
  •  在Filter中,如果你不調用chain.doFilter(request,response)方法,就表示此次請求被拒絕,返回目標路徑。 

七.獲取web.xml文件中Filter的配置信息。

  方法的調用對象:

  init(FilterConfig filterConfig)方法中的filterConifg對象.

  方法:

    getFilterName():獲得過濾器名稱

    getInitParameter(String name):獲得過濾器的初始化參數

    getInitParameterNames():獲得過濾器的所有初始化參數的名稱

    getServletContext():獲得ServletContext對象

  

 
 
 


免責聲明!

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



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