Filter接口中有一個(gè)doFilter方法,當(dāng)開發(fā)人員編寫好Filter類實(shí)現(xiàn)doFilter方法,并配置對(duì)哪個(gè)web資源進(jìn)行攔截后,WEB服務(wù)器每次在調(diào)用web資源的service方法之前(服務(wù)器內(nèi)部對(duì)資源的訪問機(jī)制決定的),都會(huì)先調(diào)用一下filter的doFilter方法。
應(yīng)用舉例:
批量設(shè)置請(qǐng)求編碼
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);// 在請(qǐng)求里設(shè)置上指定的編碼
chain.doFilter(request, response); //通過控制對(duì)chain.doFilter的方法的調(diào)用,來決定是否需要訪問目標(biāo)資源
}
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>
如上的代碼完成的功能為,無論進(jìn)入那個(gè)頁面,都要先執(zhí)行EncodingFilter類的dofilter方法設(shè)置字符集,其中,doFilter()方法類似于Servlet接口的service()方法。當(dāng)客戶端請(qǐng)求目標(biāo)資源的時(shí)候,容器就會(huì)調(diào)用與這個(gè)目標(biāo)資源相關(guān)聯(lián)的過濾器的doFilter()方法。
參數(shù) request, response 為web 容器或 Filter 鏈的上一個(gè) Filter 傳遞過來的請(qǐng)求和相應(yīng)對(duì)象;參數(shù) chain 代表當(dāng)前 Filter 鏈的對(duì)象。
對(duì)于FilterChain接口,代表當(dāng)前Filter鏈的對(duì)象。由容器實(shí)現(xiàn),容器將其實(shí)例作為參數(shù)傳入過濾器對(duì)象的doFilter()方法中。
過濾器對(duì)象使用FilterChain對(duì)象調(diào)用過濾器鏈中的下一個(gè)過濾器,或者目標(biāo)Servlet 程序去處理,也可以直接向客戶端返回響應(yīng)信息,或者利用RequestDispatcher的forward()和include()方法,以及HttpServletResponse的sendRedirect()方法將請(qǐng)求轉(zhuǎn)向到其他資源。
這個(gè)方法的請(qǐng)求和響應(yīng)參數(shù)的類型是 ServletRequest和ServletResponse,也就是說,過濾器的使用并不依賴于具體的協(xié)議。