我的初戀女友----------Filter
一、什麼是Web Filter?
Web Filter 是web開發中的一種過濾器。說道過濾器,顧名思義,就是用來過濾東西的嘛!生活中也有
非常多得例子,比如:自來水過濾器,化學實驗室濾紙也是一種過濾器。
在 web 中,服務器處理的都是用戶的各種請求,並作出相應的響應!我們不妨設想一下,在一個超級
大型的web網站應用中,加入用戶請求的一個html頁面、jsp頁面不存在,那麼服務器端肯定會報出相應的
404異常(見下圖)。
如果此時不加以任何修改,直接將下圖呈現給用戶,那麼這對用戶來說是非常不友好的,再者用戶也有
可能看不懂圖中所表示的信息是什麼。
此時我們就可以通過過濾器,將所有404的錯誤以一個友好的界面呈現給用戶。
二、Filter 在 Java EE API 中的位置。
Filter 技術相關的接口存放於 Java EE API 的javax.servlet包下。
1、相關的接口
Filter、FliterChain、FilterConfig、FilterRegistration、FilterRegistration.Dynamic
三、如何創建一個Filter?
在 web 應用中,所有的過濾器都需要實現 javax.servlet.Filter 接口,並實現該接口定義的以下三
個方法:
1、 void init(FilterConfig filterConfig) throws ServletException 2、 void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException 3、 void destroy()
第1個方法:init()
該方法在web 容器加載web應用時執行,並且整個web應用生命週期只執行一次,如果重新部署web應
用,則該方法會重新執行。
第2個方法:doFilter()
該方法是過濾器的核心操作,也就是具體實現過濾的操作。當用戶訪問請求與過濾器關聯的URL時,web
容器就會調用該方法,FilterChain 類型的參數可以調用chain.doFilter()方法,將請求轉發給下一個過濾
器,同時我們也可以利用請求轉發、重定向到相應的資源。
第3個方法:destory()
該方法在web應用被銷燬時自動執行。
以下是一個簡單的未實現任何操作的過濾器代碼:
/*一個普通的java類實現了javax.servlet.Filter接口就會變成一個Filter,並自動實現三個生命週期方法*/ public class FirstFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub //該方法只會在web應用被銷燬時執行 } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // TODO Auto-generated method stub //過濾器的核心操作 arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub /* * 1、該方法只會執行一次 * 2、可以通過FilterConfig類型參數 arg0 獲取到該Filter 的相關初始化參數 * 3、也可以通過該參數獲取到ServletContext上下文,通過該上下文可以獲取到該web應用的幾乎所有信息 */ } }
在傳統的web開發中,我們創建完過濾器一般都需要在web.xml文件中進行相應的配置:
<filter> <!-- 該名字可以自定義取 --> <filter-name>FirstFilter</filter-name> <!-- 對應的過濾器類,要寫上包名.類名 --> <filter-class>com.filters.FirstFilter</filter-class> </filter> <filter-mapping> <!-- 該名字一定要和上面相同 --> <filter-name>FirstFilter</filter-name> <!-- 定義該過濾器過濾的路徑,/*表示過濾所有路徑,該值可以取多個,以逗號隔開 --> <url-pattern>/*</url-pattern> </filter-mapping>
在Java EE 7 中允許我們使用註解的方式聲明一個過濾器,以下是實例:
/* *只需加上@WebFilter註解即可,並制定相應的過濾路徑及初始化參數 *1、以下代表過濾所有的路徑,即所有用戶請求的web資源都要經過該過濾器 *2、filterName:指定Filter的名字 *3、指定初始化參數(可以多個初始化參數,每一個初始化參數都是一個@WebInitParam註解) */ @WebFilter(filterName = "FirstFilter",urlPatterns = {"/*"},initParams = {@WebInitParam(name = "mood", value = "awake")}) public class FirstFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub //該方法只會在web應用被銷燬時執行 } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // TODO Auto-generated method stub //過濾器的核心操作 arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub /* * 1、該方法只會執行一次 * 2、可以通過FilterConfig類型參數 arg0 獲取到該Filter 的相關初始化參數 * 3、也可以通過該參數獲取到ServletContext上下文,通過該上下文可以獲取到該web應用的幾乎所有信息 */ } }