Filter的使用及其生命周期介紹


一、Filter

  1、 Filter簡介

    > Filter翻譯為中文是過濾器的意思。

    > Filter是JavaWeb的三大web組件之一:Servlet、Filter、Listener

    > Filter的作用是在請求到達WEB資源(HTML、CSS、Servlet、JSP)之前進行攔截。

    > Filter需要交給Tomcat訪問器來管理

  2、 Filter的作用:

      1.Filter可以在請求到達目標資源之前進行攔截

      2.Filter也可以放行請求

      3.Filter可以在響應到達瀏覽器之前做一個預處理

  3、 Filter的創建步驟

      1.創建一個類實現Filter接口

      2.在web.xml文件中對Filter進行配置

        <filter>

          <filter-name>Filter的別名</filter-name>

          <filter-class>Filter的全類名</filter-clas

        </filter>

        <filter-mapping>

          <filter-name>別名</filter-name>

          <url-pattern>需要Filter攔截的資源地址</url-pattern>

        </filter-mapping>

  4、 Filter的生命周期

      > 一個請求的發送,到響應返回是一個線程。

      > Filter的生命周期,指的是Filter對象由被創建到被銷毀的過程。

    > Filter的生命周期方法:

        - 構造器:Filter的構造器在服務器啟動時調用。 構造器只會調用一次,說明Filter也是單例多線程的。

        - init():在構造器被調用后,緊接着被調用。作用:用來初始化Filter。

        - doFilter():每一次攔截請求時都會調用。

            參數

              ServletRequest request

                > 請求報文

              ServletResponse response

                > 響應報文

              FilterChain chain

                > 該對象的作用就是放行請求:

            可以通過 chain.doFilter(request,response) 放行請求。

            當調用chain.doFilter()就相當於調用目標的資源的service方法。

        - destroy方法在項目停止時調用,用來在對象被銷毀前做一些收尾工作。

  5、url-pattern的設置規則:

      1.精確匹配:只有當目標資源的地址和url-pattern的地址一模一樣時,Filter才會攔截資源

            例子:/2.jsp , 只有當瀏覽器訪問項目根目錄下的2.jsp時,才會調用Filter

      2.路徑匹配:當訪問的資源在url-pattern配置的路徑下時,Filter就會攔截資源。

            例子1:/hello/* , 只要訪問項目根目錄下hello下的資源,就會調用Filter。

            例子2:/* , 會攔截項目根目錄下所有資源

      3.后綴匹配:只要訪問的資源地址和url-pattern的后綴一樣就會調用Filter

            例子:*.jsp 只要是以jsp結尾的請求都會攔截

      - 以上規則適用於Servlet的url-pattern配置

    - 當使用Filter攔截一個Servlet時,可以將Filter的url-pattern和Servlet的url-pattern一樣這樣Filter就會攔截發送到Servlet的請求。

    - 也可以通過在filter-mapping中添加一個servlet-name標簽來設置要攔截的Servlet的name

  6、Filter的執行順序

      > 我們可以為一個資源設置多個過濾器,

      當我們為一個資源設置了多個過濾器時,這些過濾器就組成一個Filter鏈的結構。

      當我們去調用chain.doFilter(),如果該過濾器后邊還有其他的過濾,

      相當於調用了下一個過濾器doFilter()方法

      如果過濾器后沒有其他的過濾器,我們調用chain.doFilter()

      相當於調用了目標資源的service()方法。

  > 多個Filter的執行順序,有filter-mapping標簽的配置順序決定,

      filter-mappint靠前,則filter先執行,靠后則后執行。

  > 我們可以通過修改filter-mapping的順序來修改Filter的執行順序,

  7、 登錄練習

      1. 創建一個登錄頁面login.jsp

      2. 創建一個登錄成功頁面login-success.jsp

      3. 創建一個UsernameFilter,來檢查用戶的用戶名是否正確,默認用戶名為admin。

        - UsernameFilter要對哪個資源進行過濾?

          - 對login-success.jsp的請求進行過濾

            檢查用戶名是否為admin

              如果是admin,則放行

              否則直接轉發回登錄頁面。

      4. 創建一個PasswordFilter,用來檢查用戶的密碼是否正確,密碼為123123.

        - 攔截發送給login-success.jsp

          - 獲取用戶填寫的密碼

            判斷密碼是否為123123

              如果是123123

                則放行

              否則直接轉發回登錄頁面。

  8、 HttpFilter

    仿寫HttpFilter,仿寫和HttpServlet一致!

  9、 dispatcher

    > Filter默認只會攔截直接向目標資源發送的請求,而像轉發之類的請求不會攔截

    > 可以在在filter-mapping的dispatcher標簽中來指定過濾器要攔截的請求類型:

    <dispatcher>REQUEST</dispatcher>

    代表攔截發送到目標資源的直接請求,如果不指定dispatcher默認值就是request

    如果在filter-mapping設置了dispatcher則按照設置的內容來

    <dispatcher>FORWARD</dispatcher>

        FORWARD代表會攔截通過轉發訪問目標資源的請求。

    <dispatcher>INCLUDE</dispatcher>

        INCLUDE會攔截通過動態包含訪問目標資源的請求。

    <dispatcher>ERROR</dispatcher>

        ERROR是攔截在web.xml中聲明的錯誤頁面的

      - 我們可以在web.xml文件進行一個錯誤頁面的映射,通過如下標簽:

        <error-page>

          <error-code>404</error-code>

          <location>/4.jsp</location>

        </error-page>

      error-code指的是發生錯誤的代碼

      location 發生錯誤以后去到的頁面

  10、 EncodingFilter。

      - 項目開發完畢以后,發現項目中出現請求亂碼的問題。

      - 這個問題解決起來還是很簡單,只需要在第一次使用request.getParamter()時調用request.setCharacterEncoding("utf-8");即可。

      - 但是這行代碼實際在大部分servlet中都需要調用。

      - 統一來解決post請求亂碼的問題?

      - 創建一個Filter用來過濾所有請求,在Filter將request的編碼設置為utf-8,然后在放行請求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM