Filter介紹
Filter是定義在javax.servlet包下面的一個(gè)接口,開(kāi)發(fā)web應(yīng)用時(shí),如果編寫(xiě)的Java類(lèi)實(shí)現(xiàn)了這個(gè)接口,則把這個(gè)java類(lèi)稱(chēng)之為過(guò)濾器Filter。
Filter過(guò)濾器的作用
Filter在web開(kāi)發(fā)中的作用圖如下:

Filter的主要作用是在web訪問(wèn)資源的時(shí)候進(jìn)行攔截,具體攔截下來(lái)需要做什么,可以自定義,比如說(shuō):1,處理全站中文亂碼的問(wèn)題;2,對(duì)網(wǎng)站內(nèi)容進(jìn)行敏感詞的過(guò)濾器功能;3,對(duì)用戶權(quán)限進(jìn)行判斷等等功能。
如何使用Filter
這個(gè)接口中只定義了3個(gè)方法,init(FilterConfig filterConfig)、destroy()和doFilter(ServletRequest request,ServletResponse response,FilterChain chain)。我們?cè)趯?shí)際開(kāi)發(fā)中一般只需要編寫(xiě)java類(lèi)實(shí)現(xiàn)Filter接口,并實(shí)現(xiàn)其doFilter方法。然后在 web.xml 文件中使用和元素對(duì)編寫(xiě)的Filter類(lèi)進(jìn)行注冊(cè),并設(shè)置它所能攔截的資源。

web.xml的配置格式如下:

果在啟動(dòng)中需要其他參數(shù)可以在配置文件d <filter>中使用<init-param>來(lái)配置
Filter的執(zhí)行流程
Filter的創(chuàng)建和銷(xiāo)毀由WEB服務(wù)器負(fù)責(zé)。 web 應(yīng)用程序啟動(dòng)時(shí),web 服務(wù)器將創(chuàng)建Filter 的實(shí)例對(duì)象,并調(diào)用其init方法,完成對(duì)象的初始化功能(init方法需要一個(gè)參數(shù)FilterConfig,這個(gè)參數(shù)可以讀取初始化的信息),從而為后續(xù)的用戶請(qǐng)求作好攔截的準(zhǔn)備工作(注:filter對(duì)象只會(huì)創(chuàng)建一次,init方法也只會(huì)執(zhí)行一次),web應(yīng)用移除或服務(wù)器停止時(shí),destroy()被調(diào)用。該方法在Filter的生命周期中僅執(zhí)行一次。在這個(gè)方法中,可以釋放過(guò)濾器使用的資源(比如內(nèi)存,文件句柄等)。
從官方API中可以看到,在執(zhí)行doFilter方法的時(shí)候除了帶上ServletRequest和ServletRequest之外,還有一個(gè)FilterChain這個(gè)對(duì)象,這個(gè)對(duì)象也有一個(gè)doFilter方法,F(xiàn)ilterChain這個(gè)對(duì)象的doFilter方法表示當(dāng)前攔截通過(guò),檢查后面的是否還有Filter,如果有繼續(xù)執(zhí)行下一Filter,如果沒(méi)有,那么后面的資源會(huì)被訪問(wèn)。
注意在web.xml文件中配置Filter是有順序的,先注冊(cè)的先執(zhí)行。
舉個(gè)栗子
package cn.quanbove;
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 FilterDemo1 implements Filter {
private FilterConfig config;//用于讀取初始化信息
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String value = this.config.getInitParameter("xxx");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("servletDemo1之前");
chain.doFilter(request, response);? //放行
System.out.println("servletDemo1之后!!");
}
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter被創(chuàng)建了!!");
this.config = filterConfig;
}
public void destroy() {
System.out.println("filter被銷(xiāo)毀了!!");
}
}
配置文件如下

這個(gè)例子執(zhí)行之后可以看到Filter初始化和銷(xiāo)毀以及執(zhí)行流程和操作方法。