過濾器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>
<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,如果沒有,則調用目標資源。
- 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對象
