Web開發---過濾器(Filter)
開發人員通過對Filter配置,可以管理所有的web資源,對jsp,servlet,靜態圖片或者靜態html進行攔截。還可以在返回之前進行攔截處理。
一個java類實現了Filter介面,就可以成為一個Filter(過濾器)。想要呼叫它,需要在web.xml中配置。下面分兩部分來介紹:
1.web.xml中配置元素
想要在web.xml請求之後正確的進行攔截操作(呼叫過濾器),需要配置兩部分引數:
//第一先配置呼叫的哪個filter類,如下
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.sinitek.managerframework.base.filter.WebFilterTemplate</filter-class>
</filter>
//第二,配置對哪些網頁請求進行過濾
<filter-mapping>
<param-name>encodingFilter</param-name>
<url-pattern>*.action</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
這裡需要注意的是兩個紅色部分的名稱必須相等,它才能正確去呼叫。/*表示對所有的請求進行攔截,還可以指定某個jsp等。這裡有一 個dispatcher標籤。如果不寫,預設為REQUEST, 指定過濾器所攔截的資源被 Servlet 容器呼叫的方式。
還有其他幾個:
REQUEST:
當用戶直接訪問頁面時,Web容器將會呼叫過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問或ERROR情況時,那麼該過濾器就不會被呼叫。
INCLUDE:
如果目標資源是通過RequestDispatcher的include()方法訪問時,那麼該過濾器將被呼叫。除此之外,該過濾器不會被呼叫。
FORWARD:
如果目標資源是通過RequestDispatcher的forward()方法訪問時,那麼該過濾器將被呼叫,除此之外,該過濾器不會被呼叫。
ERROR:
如若在A.jsp頁面page指令中指定了error屬性=examError.jsp,那麼A.jsp中若出現了異常,會跳轉到examError.jsp中處理。而在跳轉到examError.jsp時,若過濾器配置了
ERROR的dispather那麼則會攔截,否則不會攔截。
2.Filter類
package com.test.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Demo1Filter implements Filter {
private FilterConfig filterConfig;
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Demo1過濾前");
System.out.println(filterConfig.getInitParameter("param1"));
chain.doFilter(request, response);//放行。讓其走到下個鏈或目標資源中
System.out.println("Demo1過濾後");
}
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化了");
this.filterConfig = filterConfig;
}
public void destroy() {
System.out.println("銷燬了");
}
}
如圖就是一個Filter類。有三個方法:
init方法在載入啟動web容器時就會載入
doFilter方法就是呼叫攔截器方法。通過控制對chain.doFilter的方法的呼叫,來決定是否需要訪問目標資源。
destroy,當應用服務被停止或重新裝載了,則會執行Filter的destroy方法,Filter物件銷燬。
init方法與destroy方法只會直接一次。
如果web.xml中配置多個filter,它會依次呼叫每個filter的放行方法以及放行前方法,然後在逆著執行放行後的方法。最終返回。