【Servlet】过滤器技术
過濾器技術
- 過濾器
- 過濾器的運行原理
- 過濾器鏈
- 過濾器的核心接口
- Filter
- FilterConfig
- FilterChain
- 過濾器的生命周期
- 過濾器的開發(fā)
- 過濾器的應用
過濾器
過濾器(Filter)也稱之為攔截器,是Servlet 2.3規(guī)范新增的功能,在Servlet 2.4規(guī)范中得到增強。
過濾器是Servlet技術中非常實用的技術,Web開發(fā)人員通過過濾器技術,可以在用戶訪問某個Web資源(如:JSP、Servlet、HTML、圖片、CSS等)之前,對訪問的請求和響應進行攔截,從而實現(xiàn)一些特殊功能。例如,驗證用戶訪問權限、記錄用戶操作、對請求進行重新編碼、壓縮響應信息等。
過濾器所處的位置:
過濾器的運行原理
過濾器的運行原理:
- 當用戶的請求到達指定的網(wǎng)頁之前,可以借助過濾器來改變這些請求的內(nèi)容,此過程也稱為“預處理”。
- 當執(zhí)行結果要響應到用戶之前,可經(jīng)過過濾器修改響應輸出的內(nèi)容,此過程稱為“后處理”。
一個過濾器的運行過程可以分解為如下幾個步驟:
- Web容器判斷接收的請求資源是否有與之匹配的過濾器,如果有,容器將請求交給相應過濾器進行處理。
- 在過濾器預處理過程中,可以改變請求的內(nèi)容,或者重新設置請求的報頭信息,然后將請求發(fā)給目標資源。
- 目標資源對請求進行處理后作出響應。
- 容器將響應轉(zhuǎn)發(fā)回過濾器。
- 在過濾器后處理過程中,可以根據(jù)需求對響應的內(nèi)容進行修改。
- Web容器將響應發(fā)送回客戶端。
過濾器鏈
在一個Web應用中,也可以部署多個過濾器,這些過濾器組成了一個過濾器鏈。
過濾器鏈中的每個過濾器負責特定的操作和任務,客戶端的請求可以在這些過濾器之間進行傳遞,直到達到目標資源。
例如,一個由兩個過濾器所組成的過濾器鏈的過濾過程:
在客戶端的請求響應過程中,并不需要經(jīng)過所有的過濾器鏈,而是根據(jù)過濾器鏈中每個過濾器的過濾條件來匹配需要過濾的資源。
過濾器的核心接口
過濾器的實現(xiàn)主要依靠以下核心接口:
- javax.servlet.Filter
- javax.servlet.FilterConfig
- javax.servlet.FilterChain
Filter
與開發(fā)Servlet需要實現(xiàn)Servlet接口類似,開發(fā)過濾器要實現(xiàn)javax.servlet.Filter接口,并提供一個公共的不帶參數(shù)的構造方法。
Filter接口的方法及說明:
FilterConfig
javax.servlet.FilterConfig接口由容器實現(xiàn),容器將其實例作為參數(shù)傳入過濾器對象的初始化方法init()中,來獲取過濾器的初始化參數(shù)和Servlet的相關信息。
FilterConfig接口的主要方法及作用:
FilterChain
javax.servlet.FilterChain接口由容器實現(xiàn),容器將其實例作為參數(shù)傳入過濾器對象的doFilter()方法中。過濾器對象使用FilterChain對象調(diào)用過濾器鏈中的下一個過濾器,如果該過濾器是鏈中最后一個過濾器,那么將調(diào)用目標資源。
FilterChain接口主要方法及作用:
過濾器的生命周期
與Servlet類似,Filter接口定義的三個方法也與過濾器的生命周期有著直接的關系。
過濾器的生命周期分為四個階段:
- 加載和實例化
Web容器啟動時,會根據(jù)@WebFilter屬性filterName所定義的類名的大小寫拼寫順序,或者web.xml中聲明的Filter順序依次實例化Filter。 - 初始化
Web容器調(diào)用init(FilterConfig config)方法來初始化過濾器。容器在調(diào)用該方法時,向過濾器傳遞FilterConfig對象。實例化和初始化的操作只會在容器啟動時執(zhí)行,并且只會執(zhí)行一次。 - doFilter()方法的執(zhí)行
當客戶端請求目標資源的時候,容器會篩選出符合過濾器映射條件的Filter,并按照@WebFilter屬性filterName所定義的類名的大小寫拼寫順序,或者web.xml中聲明的filter-mapping的順序依次調(diào)用這些過濾器的doFilter()方法。
在這個鏈式調(diào)用過程中,可以調(diào)用FilterChain對象的doFilter方法將請求傳給下一個過濾器(或目標資源),也可以直接向客戶端返回響應信息,或者利用請求轉(zhuǎn)發(fā)或重定向?qū)⒄埱筠D(zhuǎn)向到其它資源。需要注意的是,這個方法的請求和響應參數(shù)的類型是ServletRequest和ServletResponse,也就是說,過濾器的使用并不依賴于具體的協(xié)議。 - 銷毀
Web容器調(diào)用destroy()方法指示過濾器的生命周期結束。在這個方法中,可以釋放過濾器使用的資源。
過濾器的開發(fā)
基于過濾器的核心接口,一個過濾器的開發(fā)可以經(jīng)過下述三個步驟:
- 創(chuàng)建Filter接口實現(xiàn)類。
- 編寫過濾器的功能代碼。
- 對過濾器進行聲明配置。
過濾器的應用
在Web開發(fā)中,Filter是非常重要而且實用的技術,其應用非常廣泛,如下為幾種常見的使用情況:
- 做統(tǒng)一的認證處理。
- 對用戶的請求進行檢查和更精確的記錄。
- 監(jiān)視或?qū)τ脩羲鶄鬟f的參數(shù)做前置處理,例如:防止數(shù)據(jù)注入攻擊。
- 改變圖像文件的格式。
- 對請求和響應進行編碼。
- 對響應做壓縮處理。
- 對XML的輸出使用XSLT來轉(zhuǎn)換。
總結
以上是生活随笔為你收集整理的【Servlet】过滤器技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java】数值计算排雷指南
- 下一篇: 【C语言】三种方式不使用分号输出Hell