更新時(shí)間:2021-11-15 10:43:43 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽874次
Javaweb中的過(guò)濾器可以攔截所有訪問(wèn)web資源的請(qǐng)求或響應(yīng)操作。
當(dāng)然,我們使用過(guò)濾器也是為了處理訪問(wèn)Servlet的數(shù)據(jù)。
首先我們來(lái)看一下Filter的用法。
1.創(chuàng)建一個(gè)類實(shí)現(xiàn)Filter接口
2.重寫接口中方法 doFilter方法是真正過(guò)濾的。
3.在web.xml文件中配置
下面是實(shí)現(xiàn)Filter接口的類
public class TestFilter1 implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
//請(qǐng)求過(guò)濾
System.out.println("我是filter");
chain.doFilter(request, response);
//響應(yīng)過(guò)濾
System.out.println("響應(yīng)過(guò)濾 ");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
接下來(lái)我們需要重寫接口中方法。
第三步呢就是我們需要在web.xml中配置過(guò)濾器的路徑。
<filter>
<filter-name>TestFilter1</filter-name>
<filter-class>com.daliyuan.filter.TestFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
url-pattern中的內(nèi)容也就是我們需要寫的過(guò)濾地址。/*指的是過(guò)濾所有頁(yè)面。
還有就是我們可以寫確定的訪問(wèn)地址,比如servlet/Servlet1,這樣的話我們指明確的過(guò)濾訪問(wèn)Servlet1的數(shù)據(jù).
還有就是過(guò)濾路徑格式是*.name,那么我們就可以過(guò)濾所有含有.name結(jié)尾的地址了。 格式跟servlet的url地址格式是一樣的。
還有一種格式
<servlet-name>Servlet1</servlet-name>
它是對(duì)指定的servlet名稱的servlet進(jìn)行攔截的。
對(duì)于實(shí)現(xiàn)的接口的方法,我們下面再來(lái)具體看一下。
首先要注意到的就是doFilter方法中的chain參數(shù)。 chain的方法doFilter(request, response),它實(shí)現(xiàn)的功能就是繼續(xù)執(zhí)行下面的過(guò)濾器。
FilterChain 是 servlet 容器為開發(fā)人員提供的對(duì)象,它提供了對(duì)某一資源的已過(guò)濾請(qǐng)求調(diào)用鏈的視圖。過(guò)濾器使用 FilterChain 調(diào)用鏈中的下一個(gè)過(guò)濾器,如果調(diào)用的過(guò)濾器是鏈中的最后一個(gè)過(guò)濾器,則調(diào)用鏈末尾的資源。
問(wèn)題:怎樣可以形成一個(gè)Filter鏈?
只要多個(gè)Filter對(duì)同一個(gè)資源進(jìn)行攔截就可以形成Filter鏈
問(wèn)題:怎樣確定Filter的執(zhí)行順序?
由<filter-mapping>來(lái)確定,也就是xml配置文件的順序。
我們來(lái)看一下下面的代碼。
System.out.println("我是過(guò)濾器2.....請(qǐng)求");
chain.doFilter(request, response);//去執(zhí)行下一個(gè)過(guò)濾器
System.out.println("我是過(guò)濾器2.....響應(yīng)");
----------------------------------------------------
System.out.println("我是過(guò)濾器3。。。。。 請(qǐng)求");
chain.doFilter(request, response);//去執(zhí)行index.jsp
System.out.println("我是過(guò)濾器3。。。。。 響應(yīng)");
例如,這里的兩個(gè)過(guò)濾器形成了Filter鏈,那么就先執(zhí)行過(guò)濾器2然后過(guò)濾器3的請(qǐng)求代碼。
等請(qǐng)求的頁(yè)面響應(yīng)時(shí),是先返回到響應(yīng)3然后到達(dá)響應(yīng)2
還有一點(diǎn),我們可能注意到了過(guò)濾器中的init方法和destroy方法。
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("=========初始化.....");
}
public void destroy() {
System.out.println("=========銷毀了.....");
}
過(guò)濾器在服務(wù)器啟動(dòng)加載的時(shí)候就創(chuàng)建了,在服務(wù)器關(guān)閉的時(shí)候銷毀。
Servlet生命周期:
實(shí)例化 --》 初始化 --》 服務(wù) --》 銷毀
?當(dāng)服務(wù)器啟動(dòng),會(huì)創(chuàng)建Filter對(duì)象,并調(diào)用init方法,只調(diào)用一次.
?當(dāng)訪問(wèn)資源時(shí),路徑與Filter的攔截路徑匹配,會(huì)執(zhí)行Filter中的doFilter方法,這個(gè)方法是真正攔截操作的方法.
?當(dāng)服務(wù)器關(guān)閉時(shí),會(huì)調(diào)用Filter的destroy方法來(lái)進(jìn)行銷毀操作.
我們繼續(xù)Filter。
下面我們要看的這個(gè)是FilterConfig。這個(gè)重要性應(yīng)該一般。
在Filter的init方法上有一個(gè)參數(shù),類型就是FilterConfig.
FilterConfig它是Filter的配置對(duì)象,它可以完成下列功能
1.獲取Filter名稱
2.獲取Filter初始化參數(shù)
3.獲取ServletContext對(duì)象。
我們獲取到的數(shù)據(jù)是從配置文件獲取的
<filter>
<filter-name>TestFilter5</filter-name>
<filter-class>com.qianfeng.filter.TestFilter5</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
然后呢,F(xiàn)ilterConfig是這么用的。
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String encode = filterConfig.getInitParameter("encoding");
//request.setCharacterEncoding(encode);
System.out.println(encode);
chain.doFilter(request, response);
}
GO ON 過(guò)濾器。
<dispatcher>
可以取的值有 REQUEST FORWARD ERROR INCLUDE
它的作用是:當(dāng)以什么方式去訪問(wèn)web資源時(shí),進(jìn)行攔截操作.
1.REQUEST 當(dāng)是從瀏覽器直接訪問(wèn)資源,或是重定向到某個(gè)資源時(shí)進(jìn)行攔截方式配置的 它也是默認(rèn)值
2.FORWARD 它描述的是請(qǐng)求轉(zhuǎn)發(fā)的攔截方式配置
3.ERROR 如果目標(biāo)資源是通過(guò)聲明式異常處理機(jī)制調(diào)用時(shí),那么該過(guò)濾器將被調(diào)用。除此之外,過(guò)濾器不會(huì)被調(diào)用。
4.INCLUDE 如果目標(biāo)資源是通過(guò)RequestDispatcher的include()方法訪問(wèn)時(shí),那么該過(guò)濾器將被調(diào)用。除此之外,該過(guò)濾器不會(huì)被調(diào)用
<filter-mapping>
<filter-name>TestFilter6</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
這個(gè)是什么用呢。
之前我們每說(shuō)過(guò),比如當(dāng)我們?cè)L問(wèn)一個(gè)Servlet1時(shí),Servlet1中有跳轉(zhuǎn),這時(shí)候我們之前的過(guò)濾器就不能發(fā)揮作用了。
那么就需要修改過(guò)濾器的配置了。
這是我們就需要設(shè)置dispatcher屬性了。
上面也具體說(shuō)明了,有四種取值。
這是我們?cè)儆胷esquest和response跳轉(zhuǎn)的時(shí)候,我們的過(guò)濾器就可以攔截了。
Fliter過(guò)濾器就說(shuō)這么多了。
通過(guò)上述相信大家對(duì)Filter使用方法已經(jīng)有所了解,大家如果想了解更多相關(guān)知識(shí),可以關(guān)注一下動(dòng)力節(jié)點(diǎn)的Filter教程,里面的內(nèi)容通俗易懂,由淺到深,適合小白學(xué)習(xí),希望對(duì)大家能夠有所幫助。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743