Filter過濾器-JavaWeb三大組件之一
Servlet、Filter、Listener是JavaWeb的三大組件,給Web開發提供了很大的便利。
-
什麽是Filter?
Filter,過濾器。類似與生活中的凈水器、空氣凈化器。
JavaWeb中Filter的作用:當瀏覽器請求訪問服務器的資源時,過濾器可以將請求攔截下來,完成一下特殊的功能。例如:登錄驗證、統一編碼處理、敏感字符過濾等。
-
Filter的基本使用
(1)定義一個類,實現接口Filter。
(2)實現Filter接口的方法
(3)配置攔截路徑。可以用web.xml進行配置;Servlet 3.0以後還可以用註解進行配置。
示例1(註解配置):
@WebFilter("/index.jsp")public class FilterDemo1 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("過濾請求req的代碼"); filterChain.doFilter(servletRequest,servletResponse); // 放行請求 System.out.println("增強響應resp的代碼"); } @Override public void destroy() { } }
示例2(web.xml配置):
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <filter> <filter-name>filter1</filter-name> <filter-class>com.chichung.web.filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>filter1</filter-name> <url-pattern>/index.jsp</url-pattern> </filter-mapping> </web-app>
上面兩個示例的輸出結果都是:
過濾請求req的代碼
index...
增強響應resp的代碼
說明,Filter的執行順序是:
(1)執行過濾器放行代碼上邊的代碼
(2)執行放行代碼 filterChain.doFilter(servletRequest,servletResponse)
(3)執行放行後的資源 index.jsp
(4)回來執行過濾器放行代碼下邊的代碼
所以Filter可以對請求對象進行過濾,還可以對響應對象進行功能上的增強,再返回給客戶端。
-
關於攔截的配置
上面講了一下兩種配置攔截的兩種方式。
下面是攔截路徑的幾種方式:
(1)具體資源路徑: /index.jsp 只有訪問index.jsp資源時,過濾器才會被執行
(2)攔截目錄: /user/* 訪問/user下的所有資源時,過濾器都會被執行
(3)後綴名攔截: *.jsp 訪問所有後綴名為jsp資源時,過濾器都會被執行
(4)攔截所有資源:/* 訪問所有資源時,過濾器都會被執行
還有就是攔截方式的配置。什麽是攔截方式呢?我們有些請求是直接訪問jsp文件,有些請求是先訪問Servlet,然後Servlet通過請求轉發到到jsp顯示。直接訪問jsp文件我們可以用上面的示例代碼解決,但是請求轉發或者其他方式呢?
* 註解配置:
* 設置dispatcherTypes屬性
1. REQUEST:默認值。瀏覽器直接請求資源
2. FORWARD:轉發訪問資源
3. INCLUDE:包含訪問資源
4. ERROR:錯誤跳轉資源
5. ASYNC:異步訪問資源
* web.xml配置
* 設置<dispatcher></dispatcher>標簽即可
-
過濾器的生命周期
Filter接口的三個方法:
1. init:在服務器啟動後,會創建Filter對象,然後調用init方法。只執行一次。用於加載資源
2. doFilter:每一次請求被攔截資源時,會執行。執行多次
3. destroy:在服務器關閉後,Filter對象被銷毀。如果服務器是正常關閉,則會執行destroy方法。只執行一次。用於釋放資源
-
過濾器鏈(配置多個過濾器)
執行順序:如果有兩個過濾器:過濾器1和過濾器2
1. 過濾器1
2. 過濾器2
3. 資源執行
4. 過濾器2
5. 過濾器1
過濾器先後順序問題:
1. 註解配置:按照類名的字符串比較規則比較,值小的先執行。例如: AFilter 和 BFilter,AFilter就先執行了。
2. web.xml配置: <filter-mapping>誰定義在上邊,誰先執行。
Filter過濾器-JavaWeb三大組件之一