天天看點

JavaWeb三大元件之Servlet規範中的過濾器——Filter

過濾器的介紹

  • 過濾器——Filter,它是JavaWeb三大元件之一。另外兩個是Servlet和Listener
  • 它可以對web應用中的所有資源進行攔截,并且在攔截之後進行一些特殊的操作
  • 在程式中通路伺服器資源時,當一個請求到來,伺服器首先判斷是否有過濾器與請求資源相關聯,如果有,過濾器可以将請求攔截下來,完成一些特定的功能,再由過濾器決定是否交給請求資源。如果沒有則像之前那樣直接請求資源了。響應也是類似的!
  • 過濾器一般用于完成通用的操作,例如:登入驗證、統一編碼處理、敏感字元過濾等

Filter介紹

  • Filter 是一個接口,如果想實作過濾器的功能,必須實作該接口
  • 核心方法
    傳回值 方法名 作用
    void init(FilterConfig config) 初始化方法
    void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain) 對請求資源和響應資源過濾
    void destory() 銷毀方法
  • 配置方式
    • 注解方式
    • 配置檔案

FilterChain

  • FilterChain 是一個接口,代表過濾器鍊對象。由 Servlet 容器提供實作類對象,直接使用即可。
  • 過濾器可以定義多個,就會組成過濾器鍊
  • 核心方法
    傳回值 方法名 作用
    void doFilter(ServletRequest req,ServletResponse resp) 放行方法
  • 代碼示範:
    @WebFilter("/*")
    public class FilterDemo01 implements Filter{
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("filterDemo01執行了...");
            //處理亂碼
            servletResponse.setContentType("text/html;charset=UTF-8");
            //放行
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }
               

Filter過濾器的使用細節

  • 配置方式
    • 注解方式 @WebFilter(攔截路徑)
    • 配置檔案方式
      <filter>
          <filter-name>filter01</filter-name>
          <filter-class>com.lichee.filter.Demo01</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>filter01</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
                 
  • 多個過濾器使用順序
    • 如果有多個過濾器,取決于過濾器映射的順序
    • 也就是filter-mapping配置的先後順序

生命周期

  • 建立(出生)
    • 當應用加載時執行個體化對象并執行 init 初始化方法
  • 服務(活着)
    • 對象提供服務的過程,執行 doFilter 方法
    • 隻要應用一直提供服務,對象就一直存在
  • 銷毀(死亡)
    • 當應用解除安裝時或伺服器停止時對象銷毀。執行 destroy 方法
  • Filter的執行個體對象在記憶體中也隻有一份。是以也是單例的。
  • 案例:
    @WebFilter("/*")
    public class FilterDemo03 implements Filter{
        //初始化方法
        @Override
        public void init(FilterConfig filterConfig) {
            System.out.println("對象初始化成功了...");
        }
    
        //提供服務方法
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("filterDemo03執行了...");
            //處理亂碼
            servletResponse.setContentType("text/html;charset=UTF-8");
            //放行
            filterChain.doFilter(servletRequest,servletResponse);
        }
    
        //對象銷毀
        @Override
        public void destroy() {
            System.out.println("對象銷毀了...");
        }
    }
               

FilterConfig過濾器配置對象

  • FilterConfig 是一個接口。代表過濾器的配置對象,可以加載一些初始化參數。
    • 與ServletConfig類似
  • 核心方法
    傳回值 方法名 作用
    String getFilterName() 擷取過濾器對象名稱
    String getInitParameter(String key) 根據key過去value
    Enumeration getInitParameterNames() 獲所有參數的key
    ServletContext getServletContext() 擷取應用上下文對象

過濾器的五種攔截行為

  • Filter 過濾器預設攔截的是請求,但是在實際開發中,我們還有請求轉發和請求包含,以及由伺服器觸發調用的全局錯誤頁面。預設情況下過濾器是不參與過濾的,要想使用,就需要我們配置
  • 攔截方式
    <filter>
        <filter-name>filter1</filter-name>
        <filter-class>com.lichee.filter.Demo1</filter-class>
        <!--配置開啟異步支援,當dispatcher配置ASYNC時,需要配置此行-->
        <async-supported>true</async-supported>
    </filter>
    <filter-mapping>
        <filter-name>filter1</filter-name>
        <url-pattern>/filter1</url-pattern>
        <!--過濾請求:預設值。-->
        <dispatcher>REQUEST</dispatcher>
        <!--過濾全局錯誤頁面:當由伺服器調用全局錯誤頁面時,過濾器工作-->
        <dispatcher>ERROR</dispatcher>
        <!--過濾請求轉發:當請求轉發時,過濾器工作。-->
        <dispatcher>FORWARD</dispatcher>
        <!--過濾請求包含:當請求包含時,過濾器工作。它隻能過濾動态包含,jsp的include指令是靜态包含,過濾器不會起作用-->
        <dispatcher>INCLUDE</dispatcher>
        <!--過濾異步類型,它要求我們在filter标簽中配置開啟異步支援-->
        <dispatcher>ASYNC</dispatcher>
    </filter-mapping>
               

繼續閱讀