理解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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!