【Java基礎】--filter過濾器原理解析

ZeroWM發表於2015-12-17

一、什麼是Filter?

      Filter是Servlet2.3新增加的功能,它不是Servlet,它不能處理使用者請求,也不能處理使用者響應。主要對HttpServletRequest進行預處理,也對HttpServletResponse進行後處理,是典型的處理鏈。


二、Filter出現前後原理圖對比

1.JSP請求(無filter)


2.JSP請求(有filter):




三、Servlet過濾器介面

所有的Servlet過濾器介面必須實現java.servlet.Filter介面,這個介面含有三個過濾器類必須實現的方法:

1.init(FilterConfig)

Servlet過濾器的初始化方法,Servlet容器建立Servlet過濾器例項後,將呼叫這個方法。這個方法可以讀取web.xml中的Servlet過濾器的配置初始化引數

2.doFilter(ServletRequest,ServletResponse,FilterChain)

這個方法完成實際的過濾操作,當客戶請求訪問於過濾器關聯的URL時,Servlet容器將先呼叫過濾器的doFilter方法。FilterChain引數用於訪問後續過濾器

3.destroy()

Servlet容器在銷燬過濾器例項前呼叫該方法,這個方法中可以釋放Servlet過濾器佔用的資源


四、Servlet過濾器建立步驟

1.實現java.servlet.Filter介面

2.實現init方法,讀取過濾器的初始化引數

3.實現doFilter方法,完成對請求或過濾的響應

4.呼叫FilterChain介面物件的doFilter方法,向後續的過濾器傳遞請求和響應

5.銷燬過濾器


filterdemo

過濾器類:CharsetEncodingFilter

<span style="font-family:Microsoft YaHei;font-size:14px;">package com.bjpowernode.drp.util.filter;

import java.io.IOException;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * @ClassName:CharsetEncodingFilter
 * @Description:採用filter統一處理字符集
 * @author wm
 * @date 2015年12月11日上午10:53:38
 */
public class CharsetEncodingFilter implements Filter {
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	/**
	 * 過濾
	 */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		System.out.print("CharsetEncodingFilter-->>begin");
		
		//設定字符集
		request.setCharacterEncoding("GB18030");
		//將請求轉發給過濾器鏈上下一個物件,下一個過濾器
		chain.doFilter(request, response);
		System.out.println("CharsetEncodingFilter-->>end");

	}

	/**
	 * 初始化
	 */
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}

}
</span>

web.xml配置檔案:
<span style="font-family:Microsoft YaHei;font-size:14px;"><web-app> 

 <filter>
  	<filter-name>CharsetEncodingFilter</filter-name>
  	<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>CharsetEncodingFilter</filter-name>
  	<url-pattern>*.jsp</url-pattern>
  </filter-mapping>

</web-app></span>

訪問jsp頁面,進行使用者名稱的新增功能,執行的程式顯示結果:




五、傳統filter和基於Aop思想的interceptor對比

1.filter基於回撥函式doFilter(),而interceptor則基於java本身的反射機制,這是兩者最本質的區別。

2.filter依賴Servlet容器,而interceptor與該容器無關

3.filter過濾範圍比interceptor大,filter可以過濾請求,通過萬用字元可以保護頁面、圖片、檔案等等,而interceptor只能過濾請求

4.filter的過濾例外在init方法宣告,而Interceptor可以通過xml宣告是guest請求還是user請求來辨別是否過濾。


六、總結

Aop即為Aspect Oriented Programming的縮寫,面向切面的程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。Aop可以使公共服務和業務邏輯的分離,從而使兩者間的解耦度降低,提高程式碼的複用性。無論是filter還是interceptor,都是對aop思想很好的體現。



相關文章