1. 程式人生 > >Filter過濾器-JavaWeb三大組件之一

Filter過濾器-JavaWeb三大組件之一

b- row www ride 直接 except pat 周期 nts

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三大組件之一