理解Servlet過濾器(javax.servlet.Filter)


理解Servlet過濾器(javax.servlet.Filter)

                 佟強  2009年12月14日

過濾器(Filter)的概念

過濾器位於客戶端和web應用程序之間,用於檢查和修改兩者之間流過的請求和響應。
在請求到達Servlet/JSP之前,過濾器截獲請求。
在響應送給客戶端之前,過濾器截獲響應。
多個過濾器形成一個過濾器鏈,過濾器鏈中不同過濾器的先后順序由部署文件web.xml中過濾器映射<filter-mapping>的順序決定。
最先截獲客戶端請求的過濾器將最后截獲Servlet/JSP的響應信息。
過濾器的鏈式結構

    可以為一個Web應用組件部署多個過濾器,這些過濾器組成一個過濾器鏈,每個過濾器只執行某個特定的操作或者檢查。這樣請求在到達被訪問的目標之前,需要經過這個過濾器鏈。

 

實現過濾器

在Web應用中使用過濾器需要實現javax.servlet.Filter接口,實現Filter接口中所定義的方法,並在web.xml中部署過濾器。

public class MyFilter implements Filter {

    public void init(FilterConfig fc) {
        //過濾器初始化代碼
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        //在這里可以對客戶端請求進行檢查
        //沿過濾器鏈將請求傳遞到下一個過濾器。
        chain.doFilter(request, response);
        //在這里可以對響應進行處理

    }

    public void destroy( ) {
        //過濾器被銷毀時執行的代碼
    }

}

 

Filter接口

public void init(FilterConfig config)

web容器調用本方法,說明過濾器正被加載到web容器中去。容器只有在實例化過濾器時才會調用該方法一次。容器為這個方法傳遞一個FilterConfig對象,其中包含與Filter相關的配置信息。

public void doFilter(ServletRequest request,
            ServletResponse response, FilterChain chain)

每當請求和響應經過過濾器鏈時,容器都要調用一次該方法。需要注意的是過濾器的一個實例可以同時服務於多個請求,特別需要注意線程同步問題,盡量不用或少用實例變量。 在過濾器的doFilter()方法實現中,任何出現在FilterChain的doFilter方法之前地方,request是可用的;在doFilter()方法之后response是可用的。

public void destroy()

容器調用destroy()方法指出將從服務中刪除該過濾器。如果過濾器使用了其他資源,需要在這個方法中釋放這些資源。

 

部署過濾器

在Web應用的WEB-INF目錄下,找到web.xml文件,在其中添加如下代碼來聲明Filter。

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>
        cn.edu.uibe.webdev.MyFilter
    </filter-class>
    <init-param>
        <param-name>developer</param-name>
        <param-value>TongQiang</param-value>
    </init-param>
</filter>
針對一個Servlet做過濾

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <servlet-name>MyServlet</servlet-name>
</filter-mapping>
針對URL Pattern做過濾

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/book/*</url-pattern>
</filter-mapping>
<filter-mapping>標記是有先后順序的,它的聲明順序說明容器是如何形成過濾器鏈的。過濾器應當設計為在部署時很容易配置的形式。通過認真計划和使用初始化參數,可以得到復用性很高的過濾器。 過濾器邏輯與Servlet邏輯不同,它不依賴於任何用戶狀態信息,因為一個過濾器實例可能同時處理多個完全不同的請求。
---------------------
作者:老農V
來源:CSDN
原文:https://blog.csdn.net/microtong/article/details/5007170
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

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



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