1。フィルターの概要
フィルターはフィルターとも呼ばれます。サーブレットテクノロジーで最もエキサイティングなテクノロジーです。フィルターテクノロジーを通じて、Web開発者は、JSP、サーブレット、静的イメージファイル、静的HTMLファイルなど、Webサーバーによって管理されているすべてのWebリソースをインターセプトし、それによりいくつかの特別な機能を達成します。たとえば、URLレベルの許可アクセス制御、敏感な語彙のフィルタリング、応答情報の圧縮など、いくつかの高度な機能を実装します。
サーブレットAPIは、フィルターインターフェイスを提供します。 Webアプリケーションを開発するとき、書かれたJavaクラスがこのインターフェイスを実装する場合、Javaクラスはフィルターフィルターと呼ばれます。フィルターテクノロジーを通じて、開発者は、以下に示すように、ターゲットリソースにアクセスする前に、ユーザーのアクセスリクエストと応答を実装できます。
2。フィルターはどのように傍受しますか?
フィルターインターフェイスにはドフィルターメソッドがあります。インターセプトするWebリソースをフィルターと構成すると、Webサーバーは、Webリソースのサービスメソッドを呼び出す前に、毎回DOFILTERメソッドをフィルターのDoFilterメソッドを呼び出します。したがって、この方法でコードを作成すると、次の目的を達成できます。
1.ターゲットリソースを呼び出す前に、コードを実行します。
2。ターゲットリソースを呼び出すかどうか(つまり、ユーザーがWebリソースにアクセスできるかどうか)。
3。ターゲットリソースを呼び出した後、コードを実行します。
WebサーバーがDoFilterメソッドを呼び出すと、フィルターチェーンオブジェクトを渡します。フィルターチェーンオブジェクトは、フィルターインターフェイスの中で最も重要なオブジェクトです。また、DoFilterメソッドも提供します。開発者は、ニーズに応じてこの方法を呼び出すかどうかを決定できます。このメソッドが呼び出された場合、WebサーバーはWebリソースのサービスメソッド、つまりWebリソースにアクセスします。そうしないと、Webリソースにアクセスされません。
3。フィルター開発を始めます
3.1。フィルター開発手順
フィルター開発は2つのステップに分かれています。
1. Javaクラスを作成して、フィルターインターフェイスを実装し、DoFilterメソッドを実装します。
2。web.xmlファイルの<filter>および<filter-mapping>要素を使用して、書かれたフィルタークラスを登録し、インターセプトできるリソースを設定します。
フィルター例:
packy me.gacl.web.filter; Import java.io.ioexception; Import javax.servlet.filter; Import javax.servlet.filterchain; Import javax.servlet.filterconfig; Import javax.servlet.servletexception; Import javax.servlet.servletefrequest; javax.servlet.servletResponse;/*** @classname:filterdemo*@description:@description:***、chain.dofilter(リクエスト、応答)メソッドを呼び出すかどうか、つまりターゲットリソースを実行するかどうかを決定できます。実行されると、ターゲットリソースの実行結果をキャプチャでき、それによりいくつかの特別な関数* @Author:小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小�応答、フィルターチェーンチェーン)がIOException、ServleTexceptionをスローします{//リクエストと応答に合わせて前処理をしてくださいrequest.setcharacterencoding( "utf-"); respons.setcharacterencoding( "utf-"); respons.setContentType( "text/html; charset = utf-"); out.println( "実行前のfilterdemo実行前!!!") //ターゲットリソースを実行およびリリースSystem.out.println( "実行後のfilterdemo!!! web.xmlでフィルターを構成します:
<?xmlバージョン= "。" encoding = "utf-"?> <web-appバージョン= "。" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns:xsi = "http://www.w.org//xmlschema-instance http://java.sun.com/xml/ns/javaee/web-app__.xsd "> <display-name> </display-name> <welcome-file-list> <welcome-file> index.jsp </welcome-file> </welcome-file-list> <! - 構成フィルター - > <filter> <filter-name> filterdemo </filter-name> <filter-class> me.gacl.wilter.filterdemo </filter-class> </filter> <! - マッピングフィルター - > <フィルター - マッピング> <フィルター - マッピング> filterdemo </filter-name> <! - "/*"/*"リクエスト - > <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
3.2。フィルターチェーン
Webアプリケーションでは、複数のフィルターを開発および書き込み、1つのフィルターチェーンに組み合わせます。
Webサーバーは、Web.xmlファイルにフィルターが登録されている順序に従って、最初にどのフィルターを呼び出すかを決定します。最初のフィルターのDoFilterメソッドが呼び出されると、Webサーバーはフィルターチェーンを表すフィルターチェーンオブジェクトを作成し、メソッドに渡します。 DoFilterメソッドでは、開発者がフィルターチェーンオブジェクトのDoFilterメソッドを呼び出す場合、Webサーバーはフィルターチェーンオブジェクトにまだフィルターがあるかどうかを確認します。ある場合、2番目のフィルターが呼び出され、NOがある場合、ターゲットリソースが呼び出されます。
4。フィルターのライフサイクル
4.1。フィルターの作成
フィルターの作成と破壊は、Webサーバーの責任です。 Webアプリケーションが開始されると、Webサーバーはフィルターのインスタンスオブジェクトを作成し、そのinitメソッドを呼び出してオブジェクトの初期化関数を完了し、それによって後続のユーザー要求の傍受の準備をします。フィルターオブジェクトは1回のみ作成され、initメソッドは1回しか実行されません。 initメソッドのパラメーターを介して、現在のフィルター構成情報を表すFilterConfigオブジェクトを取得できます。
4.2。フィルターの破壊
Webコンテナは、フィルターを破壊するために破壊方法を呼び出します。破壊方法は、フィルターのライフサイクル中に1回だけ実行されます。破壊方法では、フィルターで使用されるリソースを解放できます。
4.3。 filterconfigインターフェイス
フィルターを構成するとき、ユーザーは<init-param>を使用して、フィルターの初期化パラメーターを構成できます。 Webコンテナがフィルターオブジェクトをインスタンス化してinitメソッドを呼び出すと、フィルターの初期化パラメーターをカプセル化するFilterConfigオブジェクトが渡されます。したがって、開発者がフィルターを書き込むと、次を取得できます。
string getFiltername():フィルターの名前を取得します。
string getInitParameter(String name):展開の説明で指定された名前を使用して、初期化パラメーターの値を返します。存在しない場合はnullを返します。
列挙getInitParameternames():フィルターのすべての初期化パラメーターの名前の列挙セットを返します。
public servletcontext getServletContext():サーブレットコンテキストオブジェクトへの参照を返します。
例:FilterConfigを使用して、フィルター構成情報を取得します
packy me.gacl.web.filter; Import java.io.ioexception; Import java.util.Enumeration; Import javax.servlet.filter; Import javax.servlet.filterchain; Import javax.servlet.filterconfig; javax.servlet.servletResponse;パブリッククラスフィルターデモ実装フィルター{/*フィルター初期化* @see javax.servlet.filter#init(javax.servlet.filterconfig)*/ @overridepublic void init(filterconfig filterconfig)throws servletexception初期化---- ");/*** <filter> <filter-name> filterdemo </filter-name> <filter-class> me.gacl.web.filter.filterdemo </filter-class> <! - フィルターデモフィルターの初期化パラメーターを構成 - > <init-param> <説明フィルターデモの初期化パラメーターの構成フィルター</説明> <param-name> name </param-name> <param-value> gacl </param-value> </init-param> <init-p aram> <説明> FilterDemoの初期化パラメーターを設定しますフィルター</description> <param-name> like </param-name> <param-value> java </param-value> </init-param> </filter> <filter-mapping> <filter-name> filterdemo </filter-name> <! - "/*" filterconfig.getFiltername(); // web.xmlファイル文字列initparam = filterconfig.getInitParameter( "name")で構成された初期化パラメーターを取得します。 string initparam = filterconfig.getInitParameter( "like"); //フィルターのすべての初期化パラメーターの名前の列挙セットを返します。 enumeration <string> initparameternames = filterconfig.getInitparameternames(); system.out.println(filtername); system.out.println(initparam); system.out.println(initparam); system.out.println(initparam); while(initparameternames.hasmoreElements()){string paramname =(string)initparameternames.nextelement(); system.out.println(paramname);}}@overridepublic void dofilter(servletrequest request、servletResponse応答、フィルターチャインチェック) {system.out.println( "実行前のfilterdemo !!!"); Chain.dofilter(リクエスト、応答); //ターゲットリソースを実行してSystem.out.println( "実行後のfilterdemo !!!");}@overridepublic void destroy(){system.out.println( "---フィルター破壊----");}}}} 5。展開をフィルター
フィルターの展開は、2つのステップに分割されます。
1.登録フィルター
2。マッピングフィルター
5.1。フィルターを登録します
フィルターを開発した後、web.xmlファイルに登録して、Webサーバーが呼び出すことができるようにする必要があります。
web.xmlファイルにフィルターの例を登録します:
<フィルター> <説明>フィルターデモフィルター</description> <filter-name> filterdemo </filterdemo </filter-class> me.gacl.web.filter.filterdemo </filter-class> <! - フィルターデモフィルターの初期化パラメーター - > <init-param> <説明フィルターデモフィルターの設定パラメーター< ript> <param-name> name </param-name> <param-value> gacl </param-value> </init-param> <init-param> <description> filterdemoフィルターの初期化パラメーターを構成</description> <param-name>
<説明>説明情報を追加するために使用されます。この要素のコンテンツは空になり、<説明>を構成できません。
<filter-name>は、フィルターの名前を指定するために使用され、要素の内容が空になりません。
<filter-class>要素は、フィルターの完全な適格なクラス名を指定するために使用されます。
<init-param>要素は、フィルターの初期化パラメーターを指定するために使用され、その子要素<param-name>はパラメーターの名前を指定し、<param-value>はパラメーターの値を指定します。フィルターでは、FilterConfigインターフェイスオブジェクトを使用して、初期化パラメーターにアクセスできます。フィルターが初期化パラメーターを指定する必要がない場合、<init-param>要素を構成しない場合があります。
5.2。マッピングフィルター
web.xmlファイルにフィルターを登録した後、web.xmlファイルにフィルターをマップする必要があります
<! - マッピングフィルター - > <フィルターマッピング> <filter-name> filterdemo </filter-name> <! - "/*"はすべてのリクエストをインターセプトすることを意味します - > <url-pattern>/*</url-pattern> </filter-mapping>
<フィルターマッピング>要素は、フィルターが傍受する責任があるリソースを設定するために使用されます。リソースをインターセプトするフィルターは、サーブレット名とリソースアクセスのリクエストパスの2つの方法で指定できます。
<filter-name>子要素は、フィルターの登録名を設定するために使用されます。この値は、<url-pattern>要素で宣言されたフィルターの名前でなければなりません。フィルター(フィルターに関連付けられたURLスタイル)によって傍受された要求パスを設定します)
<servlet-name>フィルターによって傍受されたサーブレットの名前を指定します。
<Dispatcher>フィルターによって傍受されるリソースがサーブレットコンテナによって呼び出される方法を指定します。これは、リクエスト、インクルード、フォワードアンドエラー、およびデフォルトのリクエストの1つにすることができます。ユーザーは、複数の<Dispatcher>サブエレメントを設定して指定できます
フィルターは、リソースを呼び出すさまざまな方法を傍受します。次のように:
<フィルターマッピング> <filter-name> testfilter </filter-name> <url-pattern>/index.jsp </url-pattern> <dispatcher> request </dispatcher> <dispatcher> forward </dispatcher> </filter-mapping>
子要素が設定できる値とその意味:
1. Request:ユーザーがページに直接アクセスすると、Webコンテナがフィルターを呼び出します。ターゲットリソースにcontruct()またはforward()メソッドを介してアクセスされる場合、フィルターは呼び出されません。
2.インクルード:requestdispatcherのinclude()メソッドを介してターゲットリソースにアクセスされると、フィルターが呼び出されます。それ以外は、フィルターは呼び出されません。
3.フォワード:ターゲットリソースがrequestdispatcherのフォワード()メソッドを介してアクセスされる場合、フィルターが呼び出され、フィルターはさらに呼び出されません。
4.エラー:ターゲットリソースが宣言的な例外処理メカニズムを介して呼び出される場合、フィルターは呼び出されます。それ以外は、フィルターは呼び出されません。