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