溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Servlet過濾器的工作方式是什么

發(fā)布時(shí)間:2021-12-27 16:27:09 來源:億速云 閱讀:118 作者:iii 欄目:編程語言

這篇文章主要講解了“Servlet過濾器的工作方式是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Servlet過濾器的工作方式是什么”吧!

Servlet過濾器是可插入的 Web 組件,它允許我們實(shí)現(xiàn) Web 應(yīng)用程序中的預(yù)處理和后期處理邏輯。過濾器支持 servlet 和 JSP 頁面的基本請(qǐng)求處理功能,比如日志記錄、性能、安全、會(huì)話處理、XSLT 轉(zhuǎn)換,等等。

從J2EE1.3開始,Servlet2.3規(guī)范中加入了對(duì)過濾器的支持。過濾器能夠?qū)δ繕?biāo)資源的請(qǐng)求和響應(yīng)進(jìn)行截取。過濾器的工作方式分為四種,下面讓我們分別來看看這四種過濾器的工作方式:

1、request過濾器

這種過濾器的工作方式比較簡(jiǎn)單,大家也經(jīng)常遇到,如下圖所示:

Servlet過濾器的工作方式是什么

以下是web.xml文件配置方式:

<filter > <filter-name >myFilter</filter-name > <filter-class >xx.MyFilter</filter-class > <filter > <filter-mapping > <filter-name >myFilter</filter-name > <servlet-name >目標(biāo)資源一</servlet-name > </filter-mapping >

下面我們更改一下web.xml文件的配置,如下方式:

<filter > <filter-name >myFilter</filter-name > <filter-class >xx.MyFilter</filter-class > </filter > <filter-mapping > <filter-name >myFilter</filter-name > <servlet-name >目標(biāo)資源一</servlet-name > </filter-mapping > <filter-mapping > <filter-name >myFilter</filter-name > <servlet-name >目標(biāo)資源二</servlet-name > </filter-mapping >

也就是說此過濾器對(duì)目標(biāo)資源一和目標(biāo)資源二都進(jìn)行過濾,然后當(dāng)目標(biāo)資源一被訪問的時(shí)候我們將請(qǐng)求轉(zhuǎn)發(fā)給目標(biāo)資源二,那么這個(gè)時(shí)候過濾器是怎么工作的呢?如下圖所示:

Servlet過濾器的工作方式是什么

我們可以看到,當(dāng)我們?cè)L問目標(biāo)資源一時(shí)過濾器截取了請(qǐng)求,然后再轉(zhuǎn)發(fā)給目標(biāo)資源一,然后再轉(zhuǎn)發(fā)給目標(biāo)資源二,從圖中我們可以看到過濾器沒有截取轉(zhuǎn)發(fā)到目標(biāo)資源二的請(qǐng)求,但是我們已經(jīng)在web.xml文件中配置了該過濾器對(duì)目標(biāo)資源二的過濾,為什么又沒有起到過濾作用呢?

答案就在于,目標(biāo)資源一是客戶端直接訪問,而目標(biāo)資源二是被轉(zhuǎn)發(fā)過來的,這時(shí)過濾器就不能過濾目標(biāo)資源二。如果你直接訪問目標(biāo)資源二,你會(huì)發(fā)現(xiàn)該過濾器起到了作用?

我們上面的web.xml文件配置與以下方式等價(jià):

<filter >myFilter</filter > <filter-name >myFilter</filter-name > <filter-class >xx.MyFilter</filte-class > </filter > <filter-mapping > <filter-name >myFilter</filter-name > <servlet-name >目標(biāo)資源一</servlet-name > <dispatcher >REQUEST</dispatcher > </filter-mapping > <filter-mapping > <filter-name >myFilter</filter-name > <servlet-name >目標(biāo)資源二</servlet-name > <dispatcher >REQUEST</dispatcher > </filter-mapping >

這種方式的配置,說明只有直接訪問該目標(biāo)資源時(shí)該過濾器才會(huì)起作用,對(duì)轉(zhuǎn)發(fā)到該目標(biāo)資源的請(qǐng)求將忽略不處理。

那如果我想對(duì)轉(zhuǎn)發(fā)到目標(biāo)資源二的請(qǐng)求進(jìn)行過濾,那怎么辦呢?答案見,下一種過濾器,forward過濾器。

2、forward過濾器

我們將web.xml文件的配置修改如下:

<filter >myFilter</filter > <filter-name >myFilter</filter-name > <filter-class >xx.MyFilter</filter-class > </filter > <filter-mapping > <filter-name >myFilter</filter-name > <servlet-name >目標(biāo)資源一</servlet-name > <dispatcher >REQUEST</dispatcher > </filter-mapping > <filter-mapping > <filter-name >myFilter</filter-name > <servlet-name >目標(biāo)資源二</servlet-name > <dispatcher >FORWARD</dispatcher > </filter-mapping >

工作方式如下圖所示:

Servlet過濾器的工作方式是什么

我們看對(duì)目標(biāo)資源二過濾的配置方式,這時(shí)過濾方式為forward,也就是說對(duì)轉(zhuǎn)發(fā)到目標(biāo)資源二的請(qǐng)求過濾,如果直接訪問目標(biāo)資源二,過濾器將不起作用。

3、include過濾器

理解了forward過濾器之后,include過濾器就不難理解了。以下方式:

<filter-mapping > <filter-name >myFilter</filter-name > <servlet-name >目標(biāo)資源二</servlet-name > <dispatcher >INCLUDE</dispatcher > </filter-mapping >

此表示對(duì)包含了目標(biāo)資源二的請(qǐng)求過濾,如果直接訪問目標(biāo)資源二,則此過濾器將不起作用。

include包含以下語句:

在JSP頁面中的動(dòng)作:指令包含,這時(shí)此過濾器不工作。

4、error過濾器

當(dāng)我們?cè)L問一個(gè)web目標(biāo)資源時(shí),如果服務(wù)器沒有找到該目標(biāo)資源,那么服務(wù)器就會(huì)給出一個(gè)404錯(cuò)誤代碼。如果我們給404錯(cuò)誤代碼定義一個(gè)頁面,那么當(dāng)404錯(cuò)誤發(fā)生時(shí)就會(huì)調(diào)用該頁面,請(qǐng)看以下web.xml文件的配置:

<filter-mapping > <filter-name >myFilter</filter-name > <url-pattern >/error.jsp</url-pattern > <dispatcher >ERROR</dispatcher > </filter-mapping > <error-page > <error-code >404</error-code > <location >/error.jsp</location > </error-page >

當(dāng)我們?cè)L問一個(gè)不存在的文件時(shí),就會(huì)訪問error.jsp,但是配置了過濾器對(duì)錯(cuò)誤頁面進(jìn)行過濾,所以過濾器先接受到請(qǐng)求,然后再轉(zhuǎn)發(fā)給error.jsp.

如果我們?cè)L問一個(gè)已經(jīng)存在的頁面,會(huì)不會(huì)調(diào)用error.jsp呢?如果這個(gè)頁面中有response.sendError(404,“出錯(cuò)了!”);那么該錯(cuò)誤頁面仍然會(huì)被調(diào)用,過濾器也會(huì)工作。

感謝各位的閱讀,以上就是“Servlet過濾器的工作方式是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Servlet過濾器的工作方式是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI