Servlet、Filter、Listener是JavaWeb的三大組件,給Web開發(fā)提供了很大的便利。
Filter,過濾器。類似與生活中的凈水器、空氣凈化器。
JavaWeb中Filter的作用:當(dāng)瀏覽器請(qǐng)求訪問服務(wù)器的資源時(shí),過濾器可以將請(qǐng)求攔截下來,完成一下特殊的功能。例如:登錄驗(yàn)證、統(tǒng)一編碼處理、敏感字符過濾等。
?
(1)定義一個(gè)類,實(shí)現(xiàn)接口Filter。
(2)實(shí)現(xiàn)Filter接口的方法
(3)配置攔截路徑??梢杂脀eb.xml進(jìn)行配置;Servlet 3.0以后還可以用注解進(jìn)行配置。
示例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("過濾請(qǐng)求req的代碼"); filterChain.doFilter(servletRequest,servletResponse); // 放行請(qǐng)求 System.out.println("增強(qiáng)響應(yīng)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>
上面兩個(gè)示例的輸出結(jié)果都是:
過濾請(qǐng)求req的代碼
index...
增強(qiáng)響應(yīng)resp的代碼
說明,F(xiàn)ilter的執(zhí)行順序是:
(1)執(zhí)行過濾器放行代碼上邊的代碼
(2)執(zhí)行放行代碼 filterChain.doFilter(servletRequest,servletResponse)
(3)執(zhí)行放行后的資源 index.jsp
(4)回來執(zhí)行過濾器放行代碼下邊的代碼
所以Filter可以對(duì)請(qǐng)求對(duì)象進(jìn)行過濾,還可以對(duì)響應(yīng)對(duì)象進(jìn)行功能上的增強(qiáng),再返回給客戶端。
?
上面講了一下兩種配置攔截的兩種方式。
下面是攔截路徑的幾種方式:
(1)具體資源路徑: /index.jsp?? 只有訪問index.jsp資源時(shí),過濾器才會(huì)被執(zhí)行
(2)攔截目錄: /user/*?? ?訪問/user下的所有資源時(shí),過濾器都會(huì)被執(zhí)行
(3)后綴名攔截: *.jsp?? ??? ?訪問所有后綴名為jsp資源時(shí),過濾器都會(huì)被執(zhí)行
(4)攔截所有資源:/*?? ??? ?訪問所有資源時(shí),過濾器都會(huì)被執(zhí)行
還有就是攔截方式的配置。什么是攔截方式呢?我們有些請(qǐng)求是直接訪問jsp文件,有些請(qǐng)求是先訪問Servlet,然后Servlet通過請(qǐng)求轉(zhuǎn)發(fā)到到j(luò)sp顯示。直接訪問jsp文件我們可以用上面的示例代碼解決,但是請(qǐng)求轉(zhuǎn)發(fā)或者其他方式呢?
* 注解配置:
?? ??? ??? ??? ?* 設(shè)置dispatcherTypes屬性
?? ??? ??? ??? ??? ?1. REQUEST:默認(rèn)值。瀏覽器直接請(qǐng)求資源
?? ??? ??? ??? ??? ?2. FORWARD:轉(zhuǎn)發(fā)訪問資源
?? ??? ??? ??? ??? ?3. INCLUDE:包含訪問資源
?? ??? ??? ??? ??? ?4. ERROR:錯(cuò)誤跳轉(zhuǎn)資源
?? ??? ??? ??? ??? ?5. ASYNC:異步訪問資源
* web.xml配置
?? ??? ??? ??? ?* 設(shè)置<dispatcher></dispatcher>標(biāo)簽即可
?
Filter接口的三個(gè)方法:
1. init:在服務(wù)器啟動(dòng)后,會(huì)創(chuàng)建Filter對(duì)象,然后調(diào)用init方法。只執(zhí)行一次。用于加載資源
2. doFilter:每一次請(qǐng)求被攔截資源時(shí),會(huì)執(zhí)行。執(zhí)行多次
3. destroy:在服務(wù)器關(guān)閉后,F(xiàn)ilter對(duì)象被銷毀。如果服務(wù)器是正常關(guān)閉,則會(huì)執(zhí)行destroy方法。只執(zhí)行一次。用于釋放資源
執(zhí)行順序:如果有兩個(gè)過濾器:過濾器1和過濾器2
?? ??? ??? ?1. 過濾器1
?? ??? ??? ?2. 過濾器2
?? ??? ??? ?3. 資源執(zhí)行
?? ??? ??? ?4. 過濾器2
?? ??? ??? ?5. 過濾器1
過濾器先后順序問題:
1. 注解配置:按照類名的字符串比較規(guī)則比較,值小的先執(zhí)行。例如: AFilter 和 BFilter,AFilter就先執(zhí)行了。
2. web.xml配置: <filter-mapping>誰定義在上邊,誰先執(zhí)行。
?
來源:http://www.icode9.com/content-1-109251.html聯(lián)系客服