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

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

過濾器(Filter)的概念
•過濾器位於客戶端和web應用程序之間,用於檢查和修改兩者之間流過的請求和響應。
•在請求到達Servlet/JSP之前,過濾器截獲請求。
•在響應送給客戶端之前,過濾器截獲響應。
•多個過濾器形成一個過濾器鏈,過濾器鏈中不同過濾器的先後順序由部署文件web.xml中過濾器映射的順序決定。
•最先截獲客戶端請求的過濾器將最後截獲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>

標記是有先後順序的,它的聲明順序說明容器是如何形成過濾器鏈的。過濾器應當設計爲在部署時很容易配置的形式。通過認真計劃和使用初始化參數,可以得到複用性很高的過濾器。 過濾器邏輯與Servlet邏輯不同,它不依賴於任何用戶狀態信息,因爲一個過濾器實例可能同時處理多個完全不同的請求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章