更新時(shí)間:2021-09-06 11:27:26 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1476次
過(guò)濾器是處在客戶(hù)端和服務(wù)器資源之間的一到過(guò)濾網(wǎng),我們可以根據(jù)具體的需求來(lái)對(duì)請(qǐng)求頭和數(shù)據(jù)就行預(yù)處理,也可以對(duì)響應(yīng)頭和和數(shù)據(jù)進(jìn)行后處理。例如Jsp, Servlet, 靜態(tài)圖片文件或靜態(tài)html文件等進(jìn)行攔截,從而實(shí)現(xiàn)一些特殊的功能。例如實(shí)現(xiàn)URL級(jí)別的權(quán)限訪問(wèn)控制、過(guò)濾敏感詞匯、壓縮響應(yīng)信息等一些高級(jí)功能。
服務(wù)器的servlet容器接收到客戶(hù)端發(fā)送的請(qǐng)求后,服務(wù)器的servlet容器根據(jù)web.xml配置文件中配置的Filter攔截客戶(hù)端發(fā)送request,檢查客戶(hù)端request,如果不滿(mǎn)足過(guò)濾要求,F(xiàn)ilter攔截對(duì)應(yīng)request;如果滿(mǎn)足過(guò)濾要求,則在Filter中調(diào)用doFilter方法,執(zhí)行request并對(duì)request進(jìn)行處理并產(chǎn)生response,服務(wù)器將response發(fā)送給客戶(hù)端之前,F(xiàn)ilter會(huì)攔截response是否滿(mǎn)足過(guò)濾要求,如果不滿(mǎn)足,F(xiàn)ilter會(huì)攔截response;如果滿(mǎn)足過(guò)濾要求,則將response響應(yīng)給客戶(hù)端。
1.初始化(init):filter的創(chuàng)建和銷(xiāo)毀都是有服務(wù)器負(fù)責(zé)的。服務(wù)器啟動(dòng)的時(shí)候,web服務(wù)器創(chuàng)建Filter的實(shí)例對(duì)象,并調(diào)用其init方法,完成對(duì)象的初始化功能。filter對(duì)象只會(huì)創(chuàng)建一次,init方法也只會(huì)執(zhí)行一次。
2.運(yùn)行(doFilter):攔截到請(qǐng)求時(shí),執(zhí)行doFilter方法??梢詧?zhí)行多次。
3.銷(xiāo)毀(destroy):服務(wù)器關(guān)閉時(shí),web服務(wù)器銷(xiāo)毀Filter的實(shí)例對(duì)象。

1.過(guò)濾器的快速入門(mén)
(1)定義一個(gè)類(lèi),實(shí)現(xiàn)接口Filter,并復(fù)寫(xiě)Filter接口doFilter方法
package com.wedu.demo.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* 過(guò)濾器快速入門(mén)
*/
public class FilterDemo implements Filter { public void init(FilterConfig config) throws ServletException { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("doFilter方法執(zhí)行……"); chain.doFilter(req, resp); } public void destroy() { }
}
(2)配置攔截路徑
以web.xml配置
filter com.wedu.demo.servlet.FilterDemo filter /* hello
com.wedu.demo.servlet.HelloServlet hello /hello
使用注解的方式配置攔截路徑

2.過(guò)濾器的配置詳解
(1)配置攔截路徑具體資源路徑:只有訪問(wèn)指定的資源時(shí),過(guò)濾器才會(huì)被執(zhí)行,如:/index.jsp
攔截目錄:訪問(wèn)目錄下的所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行,如:/user/*
后綴名攔截:訪問(wèn)所有指定后綴名的資源時(shí),過(guò)濾器就會(huì)被執(zhí)行,如:*.jsp
攔截所有資源:訪問(wèn)所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行,如:/*
(2)攔截方式的配置過(guò)濾器的四種攔截方式:REQUEST(默認(rèn)的)、FORWARD、INCLUDE、ERROR。REQUEST:直接訪問(wèn)目標(biāo)資源時(shí)執(zhí)行過(guò)濾器 。包括:在地址欄中直接訪問(wèn)、表單提交、超鏈接、重定向,只要在地址欄中可以看到目標(biāo)資源的路徑,就是REQUEST;
FORWARD:轉(zhuǎn)發(fā)訪問(wèn)執(zhí)行過(guò)濾器。包括:RequestDispatcher#forward()方法、標(biāo)簽都是轉(zhuǎn)發(fā)訪問(wèn);
INCLUDE:包含訪問(wèn)執(zhí)行過(guò)濾器。包括:RequestDispatcher#include()方法、標(biāo)簽都是包含訪問(wèn);
ERROR:當(dāng)目標(biāo)資源在web.xml中配置為中時(shí),并且真的出現(xiàn)異常,轉(zhuǎn)發(fā)到目標(biāo)資源時(shí),會(huì)執(zhí)行過(guò)濾器;
使用web.xml方式配置:
filter com.wedu.demo.servlet.FilterDemo
filter /* FORWARD REQUEST
使用注解的方式配置:
package com.wedu.demo.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* 過(guò)濾器的攔截方式配置
*/
@WebFilter(value = "/*",dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST})
public class FilterDemo implements Filter { public void init(FilterConfig config) throws ServletException { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("FilterDemo……"); chain.doFilter(req, resp); } public void destroy() { }
}
(3)多個(gè)過(guò)濾器的配置方式
web.xml配置
filter1 com.wedu.demo.servlet.FilterDemo
filter1 /*
filter2 com.wedu.demo.servlet.FilterDemo
filter2 /*
注意:執(zhí)行順序根據(jù)定義,誰(shuí)定義在上面誰(shuí)先先執(zhí)行。
注解方式配置
在定義的每個(gè)過(guò)濾器上面加上對(duì)應(yīng)的注解即可。
注意:執(zhí)行的順序按照類(lèi)名的字符串比較規(guī)則比較,值小的先執(zhí)行。
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"JavaWeb過(guò)濾器Filter的介紹",希望對(duì)大家有幫助,想了解更多可查看JavaWeb教程。動(dòng)力節(jié)點(diǎn)在線學(xué)習(xí)教程,針對(duì)沒(méi)有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門(mén)到精通,主要介紹了一些Java基礎(chǔ)的核心知識(shí),讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)