1. 程式人生 > >利用filter過濾器實現整個伺服器對中文的支援

利用filter過濾器實現整個伺服器對中文的支援

過濾器filter和servlet伺服器小程式一樣,也是執行在伺服器端的java類filter負責對所有的請求在到達伺服器處理程式之前,先執行一些操作,達到對資料的預處理的目的。
比如我們可以編寫一個過濾器:

@WebFilter(filterName = "FilterOne")
public class FilterOne implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws
ServletException, IOException { System.out.println("begin filter"); chain.doFilter(req, resp); System.out.println("end filter"); } public void init(FilterConfig config) throws ServletException { System.out.println("init param="+config.getInitParameter("param"
)); } }

在web.xml中進行配置:

<filter>
            <filter-name>filterone</filter-name>
            <filter-class>com.myServlet.FilterOne</filter-class>
            <init-param>
                <param-name>param</param-name>
                <param-value
>
chen</param-value> </init-param> </filter> <filter-mapping> <filter-name>filterone</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

其中init-param是過濾器可以設定的一些初始化引數。

然後執行tomcat伺服器:
這裡寫圖片描述
可以看到,初始引數在init()方法中被列印了出來。
然後隨便訪問這個伺服器上的一個網頁:
這裡寫圖片描述
可以看到,過濾器程式被執行了。

有時候,我們需要對訪問的資料進行多次過濾,這時候可能就需要用到過濾器鏈了。過濾器鏈的執行順序與web.xml檔案中對filter的宣告順序一致。
再新建一個FilterTwo,參照FilterOne修改所有的輸出資訊。並在web.xml檔案中做以下宣告:

<filter>
            <filter-name>filterone</filter-name>
            <filter-class>com.myServlet.FilterOne</filter-class>
            <init-param>
                <param-name>param</param-name>
                <param-value>chen</param-value>
            </init-param>
        </filter>

        <filter-mapping>
            <filter-name>filterone</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    <filter>
        <filter-name>filtertwo</filter-name>
        <filter-class>com.myServlet.FilterTwo</filter-class>
        <init-param>
            <param-name>param</param-name>
            <param-value>chen</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>filtertwo</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

這樣,由於FilterOne宣告在前,FilterTwo宣告在後,所以當訪問到來時應該是先處理FilterOne在處理FilterTwo。
結果如下:
這裡寫圖片描述
可以看到,這是一種類似棧的呼叫順序。入棧是訪問的到來,棧底是伺服器程式的處理,出棧是訪問的離開。

過濾器的一個應用例項,字元編碼的轉換:
比如之前我們寫過的那個servlet登入的小程式,如果我們的使用者名稱輸入中文,就會出現如下情況:
這裡寫圖片描述
可以看到,中文的使用者名稱亂碼了,所以需要對它進行編碼的轉換,如果一個一個頁面地去轉換的話,顯然很費神而且容易出錯,這時候,過濾器就是一個很好的選擇了。
我們新建一個過濾器:

@WebFilter(filterName = "FilterOne")
public class FilterOne implements Filter {
    String charEncoding;

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        if (!charEncoding.equals(req.getCharacterEncoding())){
            req.setCharacterEncoding(charEncoding);
        }
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
        charEncoding=config.getInitParameter("encoding");
        if (charEncoding==null){
            System.out.println("沒有設定編碼方法");
        }
    }
}

也就是說,如果request的編碼方式和本伺服器的編碼方式不一致,那麼久將request的編碼方式轉換為本伺服器的編碼方式(寫死在web.xml中,見下)。
然後去下一個過濾器。

web.xml檔案如下:

filter>
            <filter-name>filterone</filter-name>
            <filter-class>com.myServlet.FilterOne</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
        </filter>

        <filter-mapping>
            <filter-name>filterone</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

可以看到,現在支援中文了
這裡寫圖片描述