Filter接口中有一個doFilter方法,當開發人員編寫好Filter類實現doFilter方法,并配置對哪個web資源進行攔截后,WEB服務器每次在調用web資源的service方法之前(服務器內部對資源的訪問機制決定的),都會先調用一下filter的doFilter方法。
應用舉例:
批量設置請求編碼
public class EncodingFilter implements Filter {
private String encoding = null;
public void destroy() {
encoding = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String encoding = getEncoding();
if (encoding == null){
encoding = "gb2312";
}
request.setCharacterEncoding(encoding);// 在請求里設置上指定的編碼
chain.doFilter(request, response); //通過控制對chain.doFilter的方法的調用,來決定是否需要訪問目標資源
}
public void init(FilterConfig filterConfig) throws ServletException {
this.encoding = filterConfig.getInitParameter("encoding");
}
private String getEncoding() {
return this.encoding;
}
}
xml配置代碼
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.logcd.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如上的代碼完成的功能為,無論進入那個頁面,都要先執行EncodingFilter類的dofilter方法設置字符集,其中,doFilter()方法類似于Servlet接口的service()方法。當客戶端請求目標資源的時候,容器就會調用與這個目標資源相關聯的過濾器的doFilter()方法。
參數 request, response 為web 容器或 Filter 鏈的上一個 Filter 傳遞過來的請求和相應對象;參數 chain 代表當前 Filter 鏈的對象。
對于FilterChain接口,代表當前Filter鏈的對象。由容器實現,容器將其實例作為參數傳入過濾器對象的doFilter()方法中。
過濾器對象使用FilterChain對象調用過濾器鏈中的下一個過濾器,或者目標Servlet 程序去處理,也可以直接向客戶端返回響應信息,或者利用RequestDispatcher的forward()和include()方法,以及HttpServletResponse的sendRedirect()方法將請求轉向到其他資源。
這個方法的請求和響應參數的類型是 ServletRequest和ServletResponse,也就是說,過濾器的使用并不依賴于具體的協議。