Java中過(guò)濾器、監(jiān)聽(tīng)器和攔截器的區(qū)別詳解
Filter:過(guò)濾器
當(dāng)訪問(wèn)服務(wù)器的資源時(shí),過(guò)濾器可以將請(qǐng)求攔截下來(lái),完成一些特殊的功能。
過(guò)濾器細(xì)節(jié)
web.xml配置
<filter> <filter-name>demo1</filter-name> <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>demo1</filter-name> <!-- 攔截路徑 --> <url-pattern>/*</url-pattern> </filter-mapping>
過(guò)濾器執(zhí)行流程
1. 執(zhí)行過(guò)濾器
2. 執(zhí)行放行后的資源
3. 回來(lái)執(zhí)行過(guò)濾器放行代碼下邊的代碼
過(guò)濾器生命周期方法
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í)行一次。用于釋放資源
過(guò)濾器配置詳解
* 攔截路徑配置:
1. 具體資源路徑: /index.jsp 只有訪問(wèn)index.jsp資源時(shí),過(guò)濾器才會(huì)被執(zhí)行
2. 攔截目錄: /user/* 訪問(wèn)/user下的所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行
3. 后綴名攔截: .jsp 訪問(wèn)所有后綴名為jsp資源時(shí),過(guò)濾器都會(huì)被執(zhí)行
4. 攔截所有資源:/ 訪問(wèn)所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行
* 攔截方式配置:資源被訪問(wèn)的方式
* 注解配置:
* 設(shè)置dispatcherTypes屬性
1. REQUEST:默認(rèn)值。瀏覽器直接請(qǐng)求資源
2. FORWARD:轉(zhuǎn)發(fā)訪問(wèn)資源
3. INCLUDE:包含訪問(wèn)資源
4. ERROR:錯(cuò)誤跳轉(zhuǎn)資源
5. ASYNC:異步訪問(wèn)資源
* web.xml配置
* 設(shè)置標(biāo)簽即可
過(guò)濾器鏈(配置多個(gè)過(guò)濾器)
* 執(zhí)行順序:如果有兩個(gè)過(guò)濾器:過(guò)濾器1和過(guò)濾器2
1. 過(guò)濾器1
2. 過(guò)濾器2
3. 資源執(zhí)行
4. 過(guò)濾器2
5. 過(guò)濾器1
* 過(guò)濾器先后順序問(wèn)題:
1. 注解配置:按照類名的字符串比較規(guī)則比較,值小的先執(zhí)行
* 如: AFilter 和 BFilter,AFilter就先執(zhí)行了。
2. web.xml配置: 誰(shuí)定義在上邊,誰(shuí)先執(zhí)行
使用步驟
- 定義一個(gè)類,實(shí)現(xiàn)接口Filter
- 復(fù)寫(xiě)方法
- 配置攔截路徑
- web.xml
- 注解
@WebFilter("/*")//訪問(wèn)所有資源之前,都會(huì)執(zhí)行該過(guò)濾器 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("filterDemo1被執(zhí)行了...."); //放行 filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } }
Listener 監(jiān)聽(tīng)器
概念:web的三大組件之一。
- 事件監(jiān)聽(tīng)機(jī)制
- 事件 :一件事情
- 事件源 :事件發(fā)生的地方
- 監(jiān)聽(tīng)器 :一個(gè)對(duì)象
- 注冊(cè)監(jiān)聽(tīng):將事件、事件源、監(jiān)聽(tīng)器綁定在一起。 當(dāng)事件源上發(fā)生某個(gè)事件后,執(zhí)行監(jiān)聽(tīng)器代碼
Interceptor 攔截器
它依賴于web框架,在SpringMVC中就是依賴于SpringMVC框架。在實(shí)現(xiàn)上,基于Java的反射機(jī)制,屬于面向切面編程(AOP)的一種運(yùn)用,就是在service或者一個(gè)方法前,調(diào)用一個(gè)方法,或者在方法后,調(diào)用一個(gè)方法,比如動(dòng)態(tài)代理就是攔截器的簡(jiǎn)單實(shí)現(xiàn),在調(diào)用方法前打印出字符串(或者做其它業(yè)務(wù)邏輯的操作),也可以在調(diào)用方法后打印出字符串,甚至在拋出異常的時(shí)候做業(yè)務(wù)邏輯的操作。由于攔截器是基于web框架的調(diào)用,因此可以使用Spring的依賴注入(DI)進(jìn)行一些業(yè)務(wù)操作,同時(shí)一個(gè)攔截器實(shí)例在一個(gè)controller生命周期之內(nèi)可以多次調(diào)用。攔截器可以對(duì)靜態(tài)資源的請(qǐng)求進(jìn)行攔截處理。
Interceptor 攔截器和 Filter:過(guò)濾器區(qū)別
1.攔截器(Interceptor)是基于Java的反射機(jī)制,而過(guò)濾器(Filter)是基于函數(shù)回調(diào)。從靈活性上說(shuō)攔截器功能更強(qiáng)大些,F(xiàn)ilter能做的事情,都能做,而且可以在請(qǐng)求前,請(qǐng)求后執(zhí)行,比較靈活。Filter主要是針對(duì)URL地址做一個(gè)編碼的事情、過(guò)濾掉沒(méi)用的參數(shù)、安全校驗(yàn)(比較泛的,比如登錄不登錄之類),太細(xì)的話,還是建議用interceptor。不過(guò)還是根據(jù)不同情況選擇合適的。
2.觸發(fā)時(shí)機(jī)不同
過(guò)濾器Filter是在請(qǐng)求進(jìn)入容器后,但在進(jìn)入servlet之前進(jìn)行預(yù)處理,請(qǐng)求結(jié)束是在servlet處理完以后。
攔截器 Interceptor 是在請(qǐng)求進(jìn)入servlet后,在進(jìn)入Controller之前進(jìn)行預(yù)處理的,Controller 中渲染了對(duì)應(yīng)的視圖之后請(qǐng)求結(jié)束。
到此這篇關(guān)于Java中過(guò)濾器、監(jiān)聽(tīng)器和攔截器的區(qū)別詳解的文章就介紹到這了,更多相關(guān)過(guò)濾器、監(jiān)聽(tīng)器和攔截器的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決maven update project 后項(xiàng)目jdk變成1.5的問(wèn)題
下面小編就為大家?guī)?lái)一篇解決maven update project 后項(xiàng)目jdk變成1.5的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起 小編過(guò)來(lái)看看吧2016-11-11Java設(shè)計(jì)模式之命令模式(Command模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之命令模式(Command模式)介紹,本文講解了Command模式的定義、如何使用命令模式等內(nèi)容,需要的朋友可以參考下2015-03-03Kotlin 開(kāi)發(fā)環(huán)境詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了 Kotlin 開(kāi)發(fā)環(huán)境詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06IDEA配置Gradle及Gradle安裝的實(shí)現(xiàn)步驟
本文主要介紹了IDEA配置Gradle及Gradle安裝的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08RabbitMQ 的七種隊(duì)列模式和應(yīng)用場(chǎng)景
最近學(xué)習(xí)RabbitMQ,本文就記錄一下RabbitMQ 的七種隊(duì)列模式和應(yīng)用場(chǎng)景,方便以后使用,也方便和大家共享,相互交流2021-05-05