我的初戀女友----------Filter

我的初戀女友----------Filter



一、什麼是Web Filter?


    Web Filter 是web開發中的一種過濾器。說道過濾器,顧名思義,就是用來過濾東西的嘛!生活中也有


非常多得例子,比如:自來水過濾器,化學實驗室濾紙也是一種過濾器。


    在 web 中,服務器處理的都是用戶的各種請求,並作出相應的響應!我們不妨設想一下,在一個超級


大型的web網站應用中,加入用戶請求的一個html頁面、jsp頁面不存在,那麼服務器端肯定會報出相應的


404異常(見下圖)。

wKioL1gglVig_JsCAAB6689xzGY974.png



    如果此時不加以任何修改,直接將下圖呈現給用戶,那麼這對用戶來說是非常不友好的,再者用戶也有


可能看不懂圖中所表示的信息是什麼。


    此時我們就可以通過過濾器,將所有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應用的幾乎所有信息
		 */
	}
}












































































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章