Spring中的Filter過濾器詳解
一、Filter基本工作原理
1、Filter 程序是一個實現(xiàn)了特殊接口的 Java 類,與 Servlet 類似,也是由 Servlet 容器進(jìn)行調(diào)用和執(zhí)行的。
2、當(dāng)在 web.xml 注冊了一個 Filter 來對某個 Servlet 程序進(jìn)行攔截處理時,它可以決定是否將請求繼續(xù)傳遞給 Servlet 程序,以及對請求和響應(yīng)消息是否進(jìn)行修改。
3、當(dāng) Servlet 容器開始調(diào)用某個 Servlet 程序時,如果發(fā)現(xiàn)已經(jīng)注冊了一個 Filter 程序來對該 Servlet 進(jìn)行攔截,那么容器不再直接調(diào)用 Servlet 的 service 方法,而是調(diào)用 Filter 的 doFilter 方法,再由 doFilter 方法決定是否去激活 service 方法。
4、但在 Filter.doFilter 方法中不能直接調(diào)用 Servlet 的 service 方法,而是調(diào)用 FilterChain.doFilter 方法來激活目標(biāo) Servlet 的 service 方法,F(xiàn)ilterChain 對象時通過 Filter.doFilter 方法的參數(shù)傳遞進(jìn)來的。
5、只要在 Filter.doFilter 方法中調(diào)用 FilterChain.doFilter 方法的語句前后增加某些程序代碼,這樣就可以在 Servlet 進(jìn)行響應(yīng)前后實現(xiàn)某些特殊功能。
6、如果在 Filter.doFilter 方法中沒有調(diào)用 FilterChain.doFilter 方法,則目標(biāo) Servlet 的 service 方法不會被執(zhí)行,這樣通過 Filter 就可以阻止某些非法的訪問請求。
二、Filter鏈
1、在一個 Web 應(yīng)用程序中可以注冊多個 Filter 程序,每個 Filter 程序都可以對一個或一組 Servlet 程序進(jìn)行攔截。如果有多個 Filter 程序都可以對某個 Servlet 程序的訪問過程進(jìn)行攔截,當(dāng)針對該 Servlet 的訪問請求到達(dá)時,Web 容器將把這多個 Filter 程序組合成一個 Filter 鏈(也叫過濾器鏈)。
2、Filter 鏈中的各個 Filter 的攔截順序與它們在 web.xml 文件中的映射順序一致,上一個 Filter.doFilter 方法中調(diào)用 FilterChain.doFilter 方法將激活下一個 Filter的doFilter 方法,最后一個 Filter.doFilter 方法中調(diào)用的 FilterChain.doFilter 方法將激活目標(biāo) Servlet的service 方法。
3、只要 Filter 鏈中任意一個 Filter 沒有調(diào)用 FilterChain.doFilter 方法,則目標(biāo) Servlet 的 service 方法都不會被執(zhí)行。
三、Filter接口
一個 Filter 程序就是一個 Java 類,這個類必須實現(xiàn) Filter 接口。javax.servlet.Filter 接口中定義了三個方法:init、doFilter、destory。
1、init 方法
(1)在 Web 應(yīng)用程序啟動時,Web 服務(wù)器(Web 容器)將根據(jù)其 web.xml 文件的配置信息來創(chuàng)建每個注冊的 Filter 的實例對象,并將其保存在內(nèi)存中。
(2)Web 容器創(chuàng)建 Filter 的實例對象后,將立即調(diào)用該 Filter 對象的 init 方法。init 方法在 Filter 生命周期中僅被執(zhí)行一次,Web 容器在調(diào)用 init 方法時,會傳遞一個包含 Filter 的配置和運行環(huán)境信息的 FilterConfig 對象。
public voic init(FilterConfig filterConfig) throws ServletException
(3)開發(fā)人員可以在 init 方法中完成與構(gòu)造方法類似的初始化功能,要注意的是:如果初始化代碼要使用到 FilterConfig 對象,這些代碼只能在 init 方法中編寫,而不能在構(gòu)造方法中編寫(尚未調(diào)用 init 方法,即并沒有創(chuàng)建 FilterConfig 對象,要使用它則必然出錯)。
2、doFilter 方法
當(dāng)一個 Filter 對象能夠攔截訪問請求時,Servlet 容器將調(diào)用 Filter 對象的 doFilter 方法。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException.ServletException
其中,參數(shù) request 和 response 為 Web 容器或 Filter 鏈中上一個 Filter 傳遞過來的請求和響應(yīng)對象;參數(shù) chain 為代表當(dāng)前 Filter 鏈的對象。
3、destroy 方法
該方法在 Web 容器卸載 Filter 對象之前被調(diào)用,也僅執(zhí)行一次。
可以完成與 init 方法相反的功能,釋放被該 Filter 對象打開的資源
例如:關(guān)閉數(shù)據(jù)庫連接和 IO 流。
四、FilterChain接口
該接口用于定義一個 Filter 鏈的對象應(yīng)該對外提供的方法,這個接口只定義了一個 doFilter 方法。
public void doFilter(ServletRequest request, ServletResponse response) throws java.io.IOException.ServletException
FilterChain 接口的 doFilter 方法用于通知 Web 容器把請求交給 Filter 鏈中的下一個 Filter 去處理
如果當(dāng)前調(diào)用此方法的 Filter 對象是Filter 鏈中的最后一個 Filter,那么將把請求交給目標(biāo) Servlet 程序去處理。
五、FilterConfig 接口
1、與普通的 Servlet 程序一樣,F(xiàn)ilter 程序也很可能需要訪問 Servlet 容器。Servlet 規(guī)范將代表 ServletContext 對象和 Filter 的配置參數(shù)信息都封裝到一個稱為 FilterConfig 的對象中。
2、FilterConfig 接口則用于定義 FilterConfig 對象應(yīng)該對外提供的方法,以便在 Filter 程序中可以調(diào)用這些方法來獲取 ServletContext 對象,以及獲取在 web.xml 文件中為 Filter 設(shè)置的友好名稱和初始化參數(shù)。
3、FilterConfig接口定義的各個方法:
- getFilterName 方法,返回 <filter-name> 元素的設(shè)置值。
- getServletContext 方法,返回 FilterConfig 對象中所包裝的 ServletContext 對象的引用。
- getInitParameter 方法,用于返回在 web.xml 文件中為 Filter 所設(shè)置的某個名稱的初始化的參數(shù)值。
- getInitParameterNames 方法,返回一個 Enumeration 集合對象。
到此這篇關(guān)于Spring中的Filter過濾器詳解的文章就介紹到這了,更多相關(guān)Spring的Filter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合Mybatis Generator自動生成代碼
SpringBoot 整合 Mybatis Generator自動生成dao、entity、mapper.xml實現(xiàn)單表增刪改查。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08完美解決Logback configuration error detected的問題
這篇文章主要介紹了完美解決Logback configuration error detected的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08