過濾器的工作原理及應用
Servlet過濾器是實作了javax.servlet.Filter接口的伺服器端程式,其工作原理是,隻要在web.xml檔案配置好要攔截的用戶端請求,此時可以對請求或者響應統一設定編碼,簡化操作;同時還可以進行邏輯判斷,是否以登陸,有沒有權限通路。它是随web應用啟動而啟動的,隻初始化一次,以後就可以攔截相關請求,隻有當web應用停止或重新部署的時候才銷毀。
當在web.xml中注冊了一個filter對某個servlet程式進行攔截處理時,這個filter就成了servlet容器與該servlet程式的通信線路上的第一道關卡,該filter可以對Servlet容器發送給servlet程式的請求和servlet程式回送給servlet容器的響應進行攔截,可以決定是否請求繼續傳遞給servlet程式,以及對請求和響應消息是否進行修改。
在一個web應用程式中可以注冊多個filter程式,每個filter程式都可以對一個或一組servlet程式進行攔截
若多個filter程式對某個servlet程式的通路過程進行攔截,當針對該servlet的通路請求到達時,web容器将把這個filter程式組合成一個filter鍊(過濾器鍊)filter鍊中各個filter的攔截順序與他們在應用程式的web.xml中映射的順序一緻。
在web中過濾器的主要作用
- 對使用者請求進行統一認證(限制IP,不允許黑名單使用者通路)
- 對使用者請求進行記錄,稽核(寫入日志)
- 對使用者發送的資料進行過濾和替換(過濾不良消息)
- 轉換圖像格式
- 對響應内容進行壓縮,減少傳輸量
- 對請求,響應内容進行加密,解密操作
過濾器的類和接口
過濾器本質是一個Servlet類,隻是它要實作Filter接口。與過濾器相關的接口有三個,(Filter,FilterConfig,FilterChain)位于Javax.servlet包中。
實作:
過濾器必須實作Filter接口,然後使用這個過濾器類中的FilterChain和FilterConfig接口,該過濾器的引用将傳遞給FilterChain對象,以允許過濾器把控制權傳遞給連結中的下一個資源。FilterConfig對象将由容器提供給過濾器,以允許通路該過濾器的初始化資料。
Filter接口
(1)初始化
void init(FilterConfig fileterConfig)Servlet容器建立Servlet過濾器執行個體後将調用這個方法,在此方法中可以讀取webxml檔案的内容,包括servlet過濾器的初始化參數,也可以獲得應用程式的上下文對象。
void init(FilterConfig fileterConfig){
this.FilterConfig=filterConfig;
}
(2)處理請求和響應
void doDilter(ServletRequest request,ServletResponse response,FilterChain chain) 完成實際的過濾操作,當客戶請求通路與過濾器相關的URLhttps://baike.baidu.com/item/url/110640?fr=aladdin時,servlet先調用doFilter方法,FilterChain參數用于通路後續過濾器。
void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
{
//前置代碼--在通路資源前執行
chain.doFilter(request,response);
//後置代碼--在通路資源後執行
}
(3)銷毀
void destroy() servlet容器在銷毀過濾器執行個體前調用該方法,可在此釋放servlet過濾器占用的資源
void destroy(){
this.filterConfig=null;
}
FilterChain接口
過濾器鍊中的下一個過濾器被調用,如果調用該方法的過濾器是最後一個過濾器,那麼目标資源将被調用
1(Filter1) 2(Filter2) 3 (servlet方法)
6 5(後置代碼) 4
FilterConfig接口
擷取ServletContext和Filter配置參數
- String getFilterName() 得到過濾器名字
- ServletContext getServletContext() 得到山下文對象
- String getInitParameter(String name) 得到指定名稱的初始化參數
- Enumeration getInitParameterNames() 得到所有初始化參數的名稱,類型為集合