Filter過濾器API
Servlet過濾器API包含了3個接口,它們都在javax.servlet包中,分別是Filter接口、FilterChain接口和FilterConfig接口。
Filter接口(源碼)
public interface Filter {
public void init(FilterConfig filterConfig) throws ServletException;
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
public void destroy();
}
所有的過濾器都要實現Filter接口,該接口定義了init(),doFilter(),destory()三個方法。
1.init(FilterConfig filterConfig)
- 在web應用程序啟動時,web服務器將根據web.xml中的配置信息來創建每個注冊的filter實例對象,并將其保存在服務器的內存中。
- Web中創建Filter實例之后立即調用該Filter的init()方法。init()方法在Filter生命周期中只執行一次。
- Web容器在調用init方法時,會傳遞一個包含Filter配置和運行環境的FilterConfig對象。利用FilterConfig對象可以獲得ServletContext對象,以及部署描述中配置的過濾器的初始化參數。
2.doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
- doFilter()方法類似于Servlet接口的Service方法;
- 當客戶端請求目標資源的時候,容器就會調用與這個目標資源相關過濾器的doFilter()方法。其中參數 request, response 為 web 容器或 Filter 鏈的上一個 Filter 傳遞過來的請求和相應對象;參數 chain 為代表當前 Filter 鏈的對象。
- 特定操作完成后,可以在當前 Filter 對象的 doFilter 方法內部需要調用 FilterChain 對象的 chain.doFilter(request,response)方法才能把請求交付給 Filter 鏈中的下一個 Filter 或者目標 Servlet 程序去處理,也可以直接向客戶端返回響應信息,或者利用RequestDispatcher的forward()和include()方法,以及 HttpServletResponse的sendRedirect()方法將請求轉向到其他資源。這個方法的請求和響應參數的類型是 ServletRequest和ServletResponse,也就是說,過濾器的使用并不依賴于具體的協議。
3. public void destory()
- 在web容器卸載Filter對象之前被調用。
- 該方法在Filter生命周期中只執行一次,通過這個方法可以釋放過濾器使用的資源。
FilterChain接口
public interface FilterChain {
public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException;
}
- 此方法是由Servlet容器提供給開發者的,用于對資源請求過濾鏈的依次調用,通過FilterChain調用過濾鏈中的下一個過濾 器,如果是最后一個過濾器,則下一個就調用目標資源。
FilterCOnfig接口
public interface FilterConfig {
//返回web.xml部署文件中定義的該過濾器的名稱
public String getFilterName();
//返回調用者所處的servlet上下文
public ServletContext getServletContext();
//返回過濾器初始化參數值的字符串形式,當參數不存在時,返回nul1.name是初始化參數名
public String getInitParameter(String name);
//以Enumeration形式返回過濾器所有初始化參數值,如果沒有初始化參數,返回為空
public Enumeration getInitParameterNames();
}