Filterテクノロジー

5514 ワード

一、Filter開発入門
Filter開発は2つのステップに分けられます.
1 javaクラス実装Filterインタフェースを記述し、そのdoFilterメソッドを実現する.
public class FilterDemo1 implements Filter {

	//FilterChain filter 
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		System.out.println("filter1111 ");
		chain.doFilter(request, response);  // 
		System.out.println("filter1111 ");

	}

	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}
	
	public void destroy() {
		// TODO Auto-generated method stub

	}

}

2,web.xmlファイルでは、および要素を使用して作成したfilterクラスを登録し、ブロックできるリソースを設定します.
       <filter>
		<filter-name>FilterDemo1</filter-name>
		<filter-class>cn.yujian.web.filter.FilterDemo1</filter-class>
		<init-param>
                <param-name>word_file</param-name>  
                <param-value>/WEB-INF/word.txt</param-value>
                </init-param>
		</filter>
		
		<filter-mapping>
		<filter-name>FilterDemo1</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
		</filter-mapping>

1、登録説明:
フィルタの名前を指定します.この要素の内容は空にできません.
要素は、フィルタの完全な限定クラス名を指定するために使用されます.
要素は、フィルタに初期化パラメータを指定し、そのサブ要素はパラメータの名前を指定し、はパラメータの値を指定します.フィルタでは、FilterConfigインタフェースオブジェクトを使用して初期化パラメータにアクセスできます.
2、マッピングの説明:
要素は、Filterがブロックするリソースを設定するために使用されます.
サブ要素は、filterの登録名を設定するために使用されます.この値は、要素で宣言されたフィルタの名前でなければなりません.
filterによってブロックされたリクエストパスを設定します(フィルタに関連付けられたURLスタイル)
フィルタによってブロックされたリソースがウェブコンテナによって呼び出される方法を指定します.REQUEST、INCLUDE、FOrWARD、ERRORのいずれかであり、デフォルトのREQUESTです.ユーザーは複数のサブエレメントを設定して、Filterがリソースの複数の呼び出し方法をブロックすることを指定できます.
3,サブエレメントが設定できる値とその意味
REQUEST:ユーザーが直接ページにアクセスすると、Webコンテナからフィルタが呼び出されます.ターゲットリソースがRequestDispatcherのinclude()またはforward()メソッドでアクセスされている場合、フィルタは呼び出されません. 
INCLUDE:ターゲットリソースがRequestDispatcherのinclude()メソッドでアクセスされている場合、フィルタが呼び出されます.このほか、フィルタは呼び出されません.
FOrWARD:ターゲットリソースがRequestDispatcherのforward()メソッドでアクセスされている場合、このフィルタは呼び出されます.それ以外は呼び出されません. 
ERROR:ターゲットリソースが宣言型例外処理メカニズムによって呼び出された場合、フィルタが呼び出されます.それ以外は、フィルタは呼び出されません.
二、Filterのライフサイクル
init(FilterConfig filterConfig)throws ServletException: 
私たちが作成したサーブレットプログラムと同様に、Filterの作成と破棄はWEBサーバが担当します.Webアプリケーションが起動すると、WebサーバはFilterのインスタンスオブジェクトを作成し、そのinitメソッドを呼び出してオブジェクトの初期化機能を完了し、後続のユーザー要求にブロックの準備を完了します(注:filterオブジェクトは1回しか作成されず、initメソッドも1回しか実行されません.例)開発者はinitメソッドのパラメータを使用して、現在のfilter構成情報を表すFilterConfigオブジェクトを取得できます.
destroy():
WebコンテナがFilterオブジェクトをアンインストールする前に呼び出されます.このメソッドはFilterのライフサイクルで1回のみ実行されます.この方法では、フィルタで使用されるリソースを解放することができる.
FilterConfigインタフェース
ユーザは、filterを構成する際にを使用してfilterの初期化パラメータを設定することができ、ウェブコンテナがFilterオブジェクトをインスタンス化し、そのinitメソッドを呼び出すと、filterの初期化パラメータをカプセル化したfilter Configオブジェクトが渡されます.そのため、開発者はfilterを作成する際に、filterConfigオブジェクトの方法によって、以下の方法を得ることができます.
String getFilterName():filterの名前を取得します. 
String getInitParameter(String name):デプロイメント記述で指定した名前の初期化パラメータの値を返します.存在しない場合nullを返します.Enumeration getInitParameterName():フィルタのすべての初期化パラメータの名前の列挙セットを返します.
public ServiceletContext getServiceletContext():Serviceletコンテキストオブジェクトの参照を返します.
filterパラメータを設定するには、次の手順に従います.
     <filter>
		<filter-name>FilterDemo3</filter-name>
		<filter-class>cn.yujian.web.filter.FilterDemo3</filter-class>
		<init-param>
		<param-name>xxx</param-name>
		<param-value>yyyy</param-value>
		</init-param>
		</filter>
		
		<filter-mapping>
		<filter-name>FilterDemo3</filter-name>
		<url-pattern>/*</url-pattern>
		</filter-mapping>

フィルタパラメータを取得するには、次の手順に従います.
public class FilterDemo3 implements Filter {

	private FilterConfig filterConfig;
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("init!!!!!!!!!!!!!!!!!!!!!!");
		this.filterConfig = filterConfig;

	}
	
	public void destroy() {
		System.out.println("destroy!!!!!!!!!!!!!!!!!!!!!");

	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
			
		System.out.println("filter3.............................");
		String filterName = this.filterConfig.getFilterName();
		String parameterValue = this.filterConfig.getInitParameter("xxx");
		Enumeration enumeration =  this.filterConfig.getInitParameterNames();
		ServletContext ctx = this.filterConfig.getServletContext();
	}
}

三、Filterチェーン
1つのウェブアプリケーションでは、複数のFilterを作成することができ、これらのFilterを組み合わせて1つのFilterチェーンと呼ぶことができる.
WebサーバはFilterに従ってWeb上にある.xmlファイルの登録順序は、どのFilterを先に呼び出すかを決定し、最初のFilterのdoFilterメソッドが呼び出されると、WebサーバはFilterチェーンを表すFilter Chainオブジェクトを作成してメソッドに渡します.doFilterメソッドでは、開発者がFilterChainオブジェクトのdoFilterメソッドを呼び出すと、WebサーバはFilterChainオブジェクトにfilterがあるかどうかをチェックし、ある場合は2番目のfilterを呼び出し、ない場合はターゲットリソースを呼び出す.