Filter原理及實現批量設置請求編碼

一、Filter簡介

      Servlet API中提供了一個Filter接口,開發web應用時,如果編寫的Java類實現了這個接口,則把這個java類稱之爲過濾器Filter。通過Filter技術,開發人員可以實現用戶在訪問某個目標資源之前,對訪問的請求和響應進行攔截。簡單說,就是可以實現web容器對某資源的訪問前截獲進行相關的處理,還可以在某資源向web容器返回響應前進行截獲進行處理。

       Filter接口中有一個doFilter方法,當開發人員編寫好Filter類實現doFilter方法,並配置對哪個web資源進行攔截後,WEB服務器每次在調用web資源的service方法之前(服務器內部對資源的訪問機制決定的),都會先調用一下filter的doFilter方法。

二、例子(實現設置請求編碼)

Filter類:

public class CharsetEncodingFilter implements Filter {
	
	private String endcoding; 
	
	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		//設置字符集
		request.setCharacterEncoding(endcoding);
		
		//繼續執行
		chain.doFilter(request, response);
		
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		this.endcoding = filterConfig.getInitParameter("encoding");
		System.out.println("CharsetEncodingFilter.init()-->> endcoding=" + endcoding);
	}

}


配置XML文件:

	<filter>
		<filter-name>CharsetEncodingFilter</filter-name>
		<filter-class>com.drp.util.filter.CharsetEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>GBK</param-value>
		</init-param>		
	</filter>	
	
	<filter-mapping>
		<filter-name>CharsetEncodingFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>

filter標籤部分定義使用的過濾器,filter-mapping標籤告訴服務器把哪些請求交給過濾器處理。這裏的*.jsp表示所有jsp文件請求。這樣,所有的jsp請求都會先被CharsetEncodingFilter攔截,並在請求裏設置上指定的GBK編碼。


三、Filter生命週期

       和Servlet一樣Filter的創建和銷燬也是由WEB服務器負責。不過與Servlet區別的是:1)它是在應用啓動的時候就進行裝載Filter類(與Servlet的load-on-startup配置效果相同)。2)容器創建好Filter對象實例後,調用init()方法。接着被Web容器保存進應用級的集合容器中去了等待着,用戶訪問資源。3)當用戶訪問的資源正好被Filter的url-pattern攔截時,容器會取出Filter類調用doFilter方法,下次或多次訪問被攔截的資源時,Web容器會直接取出指定Filter對象實例調用doFilter方法(Filter對象常駐留Web容器了)。4)當應用服務被停止或重新裝載了,則會執行Filter的destroy方法,Filter對象銷燬。


四、注意事項

      1、Filter不僅可以通過url-pattern來指定攔截哪些url匹配的資源。而且還可以通過servlet-name來指定攔截哪個指定的servlet(專門爲某個servlet服務了,servlet-name對應Servlet的相關配置)。

      2、如果有多個Filter,形成一個過濾鏈,執行順序是按照在web.xml文件中的聲明順序調用。


發佈了79 篇原創文章 · 獲贊 16 · 訪問量 59萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章