Filter介紹
Filter是定義在javax.servlet包下面的一個接口,開發(fā)web應(yīng)用時耸峭,如果編寫的Java類實現(xiàn)了這個接口,則把這個java類稱之為過濾器Filter淋纲。
Filter過濾器的作用
Filter在web開發(fā)中的作用圖如下:
Filter的主要作用是在web訪問資源的時候進行攔截劳闹,具體攔截下來需要做什么,可以自定義洽瞬,比如說:1本涕,處理全站中文亂碼的問題;2伙窃,對網(wǎng)站內(nèi)容進行敏感詞的過濾器功能菩颖;3,對用戶權(quán)限進行判斷等等功能为障。
如何使用Filter
這個接口中只定義了3個方法晦闰,init(FilterConfig filterConfig)、destroy()和doFilter(ServletRequest request,ServletResponse response,FilterChain chain)产场。我們在實際開發(fā)中一般只需要編寫java類實現(xiàn)Filter接口,并實現(xiàn)其doFilter方法舞竿。然后在 web.xml 文件中使用和元素對編寫的Filter類進行注冊京景,并設(shè)置它所能攔截的資源。
web.xml的配置格式如下:
果在啟動中需要其他參數(shù)可以在配置文件d <filter>中使用<init-param>來配置
Filter的執(zhí)行流程
Filter的創(chuàng)建和銷毀由WEB服務(wù)器負責(zé)骗奖。 web 應(yīng)用程序啟動時确徙,web 服務(wù)器將創(chuàng)建Filter 的實例對象,并調(diào)用其init方法执桌,完成對象的初始化功能(init方法需要一個參數(shù)FilterConfig鄙皇,這個參數(shù)可以讀取初始化的信息),從而為后續(xù)的用戶請求作好攔截的準(zhǔn)備工作(注:filter對象只會創(chuàng)建一次仰挣,init方法也只會執(zhí)行一次)伴逸,web應(yīng)用移除或服務(wù)器停止時,destroy()被調(diào)用膘壶。該方法在Filter的生命周期中僅執(zhí)行一次错蝴。在這個方法中洲愤,可以釋放過濾器使用的資源(比如內(nèi)存,文件句柄等)顷锰。
從官方API中可以看到柬赐,在執(zhí)行doFilter方法的時候除了帶上ServletRequest和ServletRequest之外,還有一個FilterChain這個對象官紫,這個對象也有一個doFilter方法肛宋,F(xiàn)ilterChain這個對象的doFilter方法表示當(dāng)前攔截通過,檢查后面的是否還有Filter束世,如果有繼續(xù)執(zhí)行下一Filter酝陈,如果沒有,那么后面的資源會被訪問良狈。
注意在web.xml文件中配置Filter是有順序的后添,先注冊的先執(zhí)行。
舉個栗子
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)建了P蕉 遇西!");
this.config = filterConfig;
}
public void destroy() {
System.out.println("filter被銷毀了!严嗜!");
}
}
配置文件如下
這個例子執(zhí)行之后可以看到Filter初始化和銷毀以及執(zhí)行流程和操作方法粱檀。