天天看點

web過濾器

過濾器的工作原理及應用

       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中過濾器的主要作用

  1. 對使用者請求進行統一認證(限制IP,不允許黑名單使用者通路)
  2. 對使用者請求進行記錄,稽核(寫入日志)
  3. 對使用者發送的資料進行過濾和替換(過濾不良消息)
  4. 轉換圖像格式
  5. 對響應内容進行壓縮,減少傳輸量
  6. 對請求,響應内容進行加密,解密操作

過濾器的類和接口

過濾器本質是一個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配置參數

  1. String getFilterName()  得到過濾器名字
  2. ServletContext getServletContext()  得到山下文對象
  3. String getInitParameter(String name) 得到指定名稱的初始化參數
  4. Enumeration getInitParameterNames()  得到所有初始化參數的名稱,類型為集合
web