拦截器 过滤器 监听器 的区别
生活随笔
收集整理的這篇文章主要介紹了
拦截器 过滤器 监听器 的区别
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
面試的時(shí)候突然被問(wèn)了這么個(gè)問(wèn)題 本來(lái)知道點(diǎn)啥的 腦子一熱 啥也沒(méi)說(shuō)出來(lái)
總結(jié)一下 以下內(nèi)容均摘自網(wǎng)絡(luò) 但是 讀完之后 應(yīng)該會(huì)對(duì)它們有更清晰的認(rèn)識(shí)。
1.1 什么是攔截器:
攔截器,在AOP(Aspect-Oriented Programming)中用于在某個(gè)方法或字段被訪問(wèn)之前,進(jìn)行攔截然后在之前或之后加入某些操作。攔截是AOP的一種實(shí)現(xiàn)策略。
在Webwork的中文文檔的解釋為——攔截器是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象。它提供了一種機(jī)制可以使開(kāi)發(fā)者可以定義在一個(gè)action執(zhí)行的前后執(zhí)行的代碼,也可以在一個(gè)action執(zhí)行前阻止其執(zhí)行。
同時(shí)也是提供了一種可以提取action中可重用的部分的方式。
談到攔截器,還有一個(gè)詞大家應(yīng)該知道——攔截器鏈(Interceptor Chain,在Struts 2中稱為攔截器棧 Interceptor Stack)。攔截器鏈就是將攔截器按一定的順序聯(lián)結(jié)成一條鏈。
在訪問(wèn)被攔截的方法或字段時(shí),攔截器鏈中的攔截器就會(huì)按其之前定義的順序被調(diào)用。
1.2. 攔截器的實(shí)現(xiàn)原理:
大部分時(shí)候,攔截器方法都是通過(guò)代理的方式來(lái)調(diào)用的。Struts 2的攔截器實(shí)現(xiàn)相對(duì)簡(jiǎn)單。當(dāng)請(qǐng)求到達(dá)Struts 2的ServletDispatcher時(shí),Struts 2會(huì)查找配置文件,
并根據(jù)其配置實(shí)例化相對(duì)的攔截器對(duì)象,然后串成一個(gè)列表(list),最后一個(gè)一個(gè)地調(diào)用列表中的攔截器。
1.3 什么是過(guò)濾器
過(guò)濾器是一個(gè)程序,它先于與之相關(guān)的servlet或JSP頁(yè)面運(yùn)行在服務(wù)器上。過(guò)濾器可附加到一個(gè)或多個(gè)servlet或JSP頁(yè)面上,并且可以檢查進(jìn)入這些資源的請(qǐng)求信息。在這之后,過(guò)濾器可以作如下的選擇:
①以常規(guī)的方式調(diào)用資源(即,調(diào)用servlet或JSP頁(yè)面)。
②利用修改過(guò)的請(qǐng)求信息調(diào)用資源。
③調(diào)用資源,但在發(fā)送響應(yīng)到客戶機(jī)前對(duì)其進(jìn)行修改。
④阻止該資源調(diào)用,代之以轉(zhuǎn)到其他的資源,返回一個(gè)特定的狀態(tài)代碼或生成替換輸出。
1.4 Servlet過(guò)濾器的基本原理
在Servlet作為過(guò)濾器使用時(shí),它可以對(duì)客戶的請(qǐng)求進(jìn)行處理。處理完成后,它會(huì)交給下一個(gè)過(guò)濾器處理,這樣,客戶的請(qǐng)求在過(guò)濾鏈里逐個(gè)處理,直到請(qǐng)求發(fā)送到目標(biāo)為止。
例如,某網(wǎng)站里有提交“修改的注冊(cè)信息”的網(wǎng)頁(yè),當(dāng)用戶填寫(xiě)完修改信息并提交后,服務(wù)器在進(jìn)行處理時(shí)需要做兩項(xiàng)工作:判斷客戶端的會(huì)話是否有效;對(duì)提交的數(shù)據(jù)進(jìn)行統(tǒng)一編碼。
這兩項(xiàng)工作可以在由兩個(gè)過(guò)濾器組成的過(guò)濾鏈里進(jìn)行處理。
當(dāng)過(guò)濾器處理成功后,把提交的數(shù)據(jù)發(fā)送到最終目標(biāo);如果過(guò)濾器處理不成功,將把視圖派發(fā)到指定的錯(cuò)誤頁(yè)面。
2、攔截器與過(guò)濾器的區(qū)別 :
1. 攔截器是基于java的反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)。
2. 攔截器不依賴與servlet容器,過(guò)濾器依賴與servlet容器。
3. 攔截器只能對(duì)action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有的請(qǐng)求起作用。
4. 攔截器可以訪問(wèn)action上下文、值棧里的對(duì)象,而過(guò)濾器不能訪問(wèn)。
5. 在action的生命周期中,攔截器可以多次被調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次
⑥攔截器可以獲取IOC容器中的各個(gè)bean,而過(guò)濾器就不行,這點(diǎn)很重要,在攔截器里注入一個(gè)service,可以調(diào)用業(yè)務(wù)邏輯。
.SpringMVC的機(jī)制是由同一個(gè)Servlet來(lái)分發(fā)請(qǐng)求給不同的Controller,其實(shí)這一步是在Servlet的service()方法中執(zhí)行的。所以過(guò)濾器、攔截器、service()方法,dispatc()方法的執(zhí)行順序應(yīng)該是這樣的,
大致畫(huà)了個(gè)圖:其實(shí)非常好測(cè)試,自己寫(xiě)一個(gè)過(guò)濾器,一個(gè)攔截器,然后在這些方法中都加個(gè)斷點(diǎn),一路F8下去就得出了結(jié)論。
總結(jié)一下 以下內(nèi)容均摘自網(wǎng)絡(luò) 但是 讀完之后 應(yīng)該會(huì)對(duì)它們有更清晰的認(rèn)識(shí)。
1.1 什么是攔截器:
攔截器,在AOP(Aspect-Oriented Programming)中用于在某個(gè)方法或字段被訪問(wèn)之前,進(jìn)行攔截然后在之前或之后加入某些操作。攔截是AOP的一種實(shí)現(xiàn)策略。
在Webwork的中文文檔的解釋為——攔截器是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象。它提供了一種機(jī)制可以使開(kāi)發(fā)者可以定義在一個(gè)action執(zhí)行的前后執(zhí)行的代碼,也可以在一個(gè)action執(zhí)行前阻止其執(zhí)行。
同時(shí)也是提供了一種可以提取action中可重用的部分的方式。
談到攔截器,還有一個(gè)詞大家應(yīng)該知道——攔截器鏈(Interceptor Chain,在Struts 2中稱為攔截器棧 Interceptor Stack)。攔截器鏈就是將攔截器按一定的順序聯(lián)結(jié)成一條鏈。
在訪問(wèn)被攔截的方法或字段時(shí),攔截器鏈中的攔截器就會(huì)按其之前定義的順序被調(diào)用。
1.2. 攔截器的實(shí)現(xiàn)原理:
大部分時(shí)候,攔截器方法都是通過(guò)代理的方式來(lái)調(diào)用的。Struts 2的攔截器實(shí)現(xiàn)相對(duì)簡(jiǎn)單。當(dāng)請(qǐng)求到達(dá)Struts 2的ServletDispatcher時(shí),Struts 2會(huì)查找配置文件,
并根據(jù)其配置實(shí)例化相對(duì)的攔截器對(duì)象,然后串成一個(gè)列表(list),最后一個(gè)一個(gè)地調(diào)用列表中的攔截器。
1.3 什么是過(guò)濾器
過(guò)濾器是一個(gè)程序,它先于與之相關(guān)的servlet或JSP頁(yè)面運(yùn)行在服務(wù)器上。過(guò)濾器可附加到一個(gè)或多個(gè)servlet或JSP頁(yè)面上,并且可以檢查進(jìn)入這些資源的請(qǐng)求信息。在這之后,過(guò)濾器可以作如下的選擇:
①以常規(guī)的方式調(diào)用資源(即,調(diào)用servlet或JSP頁(yè)面)。
②利用修改過(guò)的請(qǐng)求信息調(diào)用資源。
③調(diào)用資源,但在發(fā)送響應(yīng)到客戶機(jī)前對(duì)其進(jìn)行修改。
④阻止該資源調(diào)用,代之以轉(zhuǎn)到其他的資源,返回一個(gè)特定的狀態(tài)代碼或生成替換輸出。
1.4 Servlet過(guò)濾器的基本原理
在Servlet作為過(guò)濾器使用時(shí),它可以對(duì)客戶的請(qǐng)求進(jìn)行處理。處理完成后,它會(huì)交給下一個(gè)過(guò)濾器處理,這樣,客戶的請(qǐng)求在過(guò)濾鏈里逐個(gè)處理,直到請(qǐng)求發(fā)送到目標(biāo)為止。
例如,某網(wǎng)站里有提交“修改的注冊(cè)信息”的網(wǎng)頁(yè),當(dāng)用戶填寫(xiě)完修改信息并提交后,服務(wù)器在進(jìn)行處理時(shí)需要做兩項(xiàng)工作:判斷客戶端的會(huì)話是否有效;對(duì)提交的數(shù)據(jù)進(jìn)行統(tǒng)一編碼。
這兩項(xiàng)工作可以在由兩個(gè)過(guò)濾器組成的過(guò)濾鏈里進(jìn)行處理。
當(dāng)過(guò)濾器處理成功后,把提交的數(shù)據(jù)發(fā)送到最終目標(biāo);如果過(guò)濾器處理不成功,將把視圖派發(fā)到指定的錯(cuò)誤頁(yè)面。
2、攔截器與過(guò)濾器的區(qū)別 :
1. 攔截器是基于java的反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)。
2. 攔截器不依賴與servlet容器,過(guò)濾器依賴與servlet容器。
3. 攔截器只能對(duì)action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有的請(qǐng)求起作用。
4. 攔截器可以訪問(wèn)action上下文、值棧里的對(duì)象,而過(guò)濾器不能訪問(wèn)。
5. 在action的生命周期中,攔截器可以多次被調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次
⑥攔截器可以獲取IOC容器中的各個(gè)bean,而過(guò)濾器就不行,這點(diǎn)很重要,在攔截器里注入一個(gè)service,可以調(diào)用業(yè)務(wù)邏輯。
.SpringMVC的機(jī)制是由同一個(gè)Servlet來(lái)分發(fā)請(qǐng)求給不同的Controller,其實(shí)這一步是在Servlet的service()方法中執(zhí)行的。所以過(guò)濾器、攔截器、service()方法,dispatc()方法的執(zhí)行順序應(yīng)該是這樣的,
大致畫(huà)了個(gè)圖:其實(shí)非常好測(cè)試,自己寫(xiě)一個(gè)過(guò)濾器,一個(gè)攔截器,然后在這些方法中都加個(gè)斷點(diǎn),一路F8下去就得出了結(jié)論。
轉(zhuǎn)載于:https://www.cnblogs.com/feiye512/p/6132272.html
總結(jié)
以上是生活随笔為你收集整理的拦截器 过滤器 监听器 的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微pe添加网络组件_为微PE添加网络组件
- 下一篇: POJ1155 TELE(树形DP)