1. 程式人生 > >javaweb繼承第十二課:過濾器

javaweb繼承第十二課:過濾器

 

這節課我們來講講過濾器Filter

 

Servlet 過濾器可以動態地攔截請求和響應,以變換或使用包含在請求或響應中的資訊。

可以將一個或多個 Servlet 過濾器附加到一個 Servlet 或一組 Servlet。Servlet 過濾器也可以附加到 Java Server Pages (JSP) 檔案和 HTML 頁面。呼叫 Servlet 前呼叫所有附加的 Servlet 過濾器。

Servlet 過濾器是可用於 Servlet 程式設計的 Java 類,可以實現以下目的:

- 在客戶端的請求訪問後端資源之前,攔截這些請求。

- 在伺服器的響應傳送回客戶端之前,處理這些響應。

 

我們來學習怎麼定義或者說建立過濾器

 

package com.filter;



import javax.servlet.*;

import javax.servlet.http.HttpServletRequest;

import java.io.IOException;



/**

 * 建立Filter步驟:

 *  1. 定義一個類實現javax.servlet.Filter介面

 *  2. 重寫抽象方法

 *  3. 在web.xml裡配置這個filter

 */

public class TeachFilter implements Filter {     @Override     public void init(FilterConfig filterConfig) throws ServletException {     }     /**      *      * @param servletRequest request物件      * @param
servletResponse response物件      * @param filterChain 過濾器鏈,用於決定是否放行      * @throws IOException      * @throws ServletException      */     @Override     /**      * 說明一下,ServletRequest是HttpServletRequest的父介面      * HttpServletRequest可以通過getRequestURL()方法來獲取請求路徑,返回物件是StringBuffer型別,可通過toString()方法轉成字串      * ServletRequest並沒有可以用來獲取請求路徑的方法      */     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {         /**          * instanceof關鍵字: 作用是判斷左邊的物件是否是右邊的型別          */         if(servletRequest instanceof HttpServletRequest)         {             String url = ((HttpServletRequest) servletRequest).getRequestURL().toString();             System.out.println("目前過濾的是 '" + url + "' 路徑");         }         else         {             System.out.println("這不是一個Http請求");         }         //可以發現它只是執行了這個方法的程式碼,但好像沒有 放行,即servlet或者jsp的程式碼沒執行         //所以,filter是在servlet之前執行的         //放行程式碼:         filterChain.doFilter(servletRequest,servletResponse);         //filterChain是過濾器鏈,在引數裡         //可以看到添加了這行程式碼後,頁面就顯示出來了     }     @Override     public void destroy() {     } }

 

下面寫個具體應用:字元編碼過濾器

package com.filter;



import javax.servlet.*;

import java.io.IOException;



//寫完了別忘了在web.xml裡配置一下

//這個字元編碼過濾器等下注冊功能要用

public class CharacterEncodingFilter implements Filter {

    @Override

    public void init(FilterConfig filterConfig) throws ServletException {



    }



    @Override

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException

    {

        System.out.println("這是字元編碼過濾器");

        servletRequest.setCharacterEncoding("UTF-8");

        servletResponse.setCharacterEncoding("UTF-8");

        filterChain.doFilter(servletRequest,servletResponse);

    }



    @Override

    public void destroy() {



    }

}

 

web.xml配置filter

<!--配置Filter-->

<filter>

    <filter-name>TeachFilter</filter-name>

    <filter-class>com.filter.TeachFilter</filter-class>

</filter>



<filter-mapping>

    <filter-name>TeachFilter</filter-name>

    <!-- /* 表示所有請求, java中級會講正則表示式,到時候就懂了-->

    <url-pattern>/*</url-pattern>

</filter-mapping>



<filter>

    <filter-name>CharacterEncodingFilter</filter-name>

    <filter-class>com.filter.CharacterEncodingFilter</filter-class>

</filter>



<filter-mapping>

    <filter-name>CharacterEncodingFilter</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

 

注意:

對於同一請求所有過濾器都會起作用(當然要加filterChain.doFilter()),執行順序是配置filter-mapping的順序

如果過濾器的doFilter方法裡沒有寫filterChain.doFilter(req,resp)則不會繼續往後執行,也就是起到了過濾的功能