フィルターの紹介
フィルターはフィルターとも呼ばれます。サーブレットテクノロジーで最も実用的なテクノロジーです。フィルターテクノロジーを通じて、Web開発者は、JSP、サーブレット、静的イメージファイル、静的HTMLファイルなど、Webサーバーによって管理されているすべてのWebリソースをインターセプトし、それによりいくつかの特別な機能を達成します。たとえば、URLレベルの許可アクセス制御、敏感な語彙のフィルタリング、応答情報の圧縮など、いくつかの高度な機能を実装します。
これは主にユーザーリクエストを前処理するために使用され、httpservletResponseを後処理することもできます。フィルターを使用する完全なプロセス:フィルタープリプロセスユーザーリクエスト、次にリクエストをサーブレットに処理して処理し、応答を生成し、最後にサーバーの応答をポストプロセスにフィルターします。
フィルター機能
1. httpservletrequestがサーブレットに到着する前に、クライアントのhttpservletrequestをインターセプトします。必要に応じてhttpservletrequestを確認すると、httpservletrequestヘッダーとデータを変更することもできます。
2.クライアントに到達する前に、HTTPSERVLETRESPONSEをインターセプトします。必要に応じてhttpservletresponseを確認すると、httpservletresponseヘッダーとデータを変更することもできます。
フィルターを使用してインターセプト関数を実装する方法
フィルターインターフェイスにはドフィルターメソッドがあります。開発者がフィルターを書き込み、どのWebリソースをインターセプトするかを構成すると、WebサーバーはWebリソースのサービスメソッドを呼び出す前に、毎回フィルターのDoFilterメソッドを呼び出します。したがって、この方法でコードを作成すると、次の目的を達成できます。
1.ターゲットリソースを呼び出す前に、コードを実行します。
2。ターゲットリソースを呼び出すかどうか(つまり、ユーザーがWebリソースにアクセスできるかどうか)。
WebサーバーがDoFilterメソッドを呼び出すと、フィルターチェーンオブジェクトを渡します。フィルターチェーンオブジェクトは、フィルターインターフェイスの中で最も重要なオブジェクトです。また、DoFilterメソッドも提供します。開発者は、ニーズに応じてこの方法を呼び出すかどうかを決定できます。このメソッドが呼び出された場合、WebサーバーはWebリソースのサービスメソッド、つまりWebリソースにアクセスします。そうしないと、Webリソースにアクセスされません。
開発開発2つのステップ
Javaクラスを作成して、フィルターインターフェイスを実装し、DoFilterメソッドを実装します。
Web.xmlファイルの使用と要素を使用して、書かれたフィルタークラスを登録し、インターセプトできるリソースを設定します。
web.xml構成ノードの紹介:
<フィルターマッピング>要素は、フィルターがインターセプトする責任があるリソースを設定するために使用されます。リソースをインターセプトするフィルターは、サーブレット名とリソースアクセスのリクエストパスの2つの方法で指定できます。
<servlet-name>フィルターによって傍受されたサーブレットの名前を指定します。
<Dispatcher>フィルターによって傍受されるリソースがサーブレットコンテナによって呼び出される方法を指定します。これは、リクエスト、インクルード、フォワードアンドエラー、およびデフォルトのリクエストの1つにすることができます。ユーザーは、複数の<ディスパッチャー>サブエレメントを設定してフィルターを指定して、リソースを呼び出すさまざまな方法を傍受できます。
子要素が設定できる値とその意味は次のとおりです
フィルターチェーン
Webアプリケーションでは、複数のフィルターを開発および書き込み、1つのフィルターチェーンに組み合わせます。
Webサーバーは、Web.xmlファイルにフィルターが登録されている順序に従って、最初にどのフィルターを呼び出すかを決定します。最初のフィルターのDoFilterメソッドが呼び出されると、Webサーバーはフィルターチェーンを表すフィルターチェーンオブジェクトを作成し、メソッドに渡します。 DoFilterメソッドでは、開発者がフィルターチェーンオブジェクトのDoFilterメソッドを呼び出す場合、Webサーバーはフィルターチェーンオブジェクトにまだフィルターがあるかどうかを確認します。ある場合、2番目のフィルターが呼び出され、NOがある場合、ターゲットリソースが呼び出されます。
フィルターのライフサイクル
public void init(filterconfig filterconfig)は、servletexception; //初期化をスローします
私たちが書くサーブレットプログラムのように、フィルターの作成と破壊はWebサーバーの責任です。 Webアプリケーションが開始されると、Webサーバーはフィルターのインスタンスオブジェクトを作成し、そのinitメソッドを呼び出してWeb.xml構成を読み取り、オブジェクトの初期化関数を完了し、その後のユーザー要求の傍受の準備をします(フィルターオブジェクトは1回のみ作成され、initメソッドは1回しか実行されません)。開発者は、initメソッドのパラメーターを介して現在のフィルター構成情報を表すFilterConfigオブジェクトを取得できます。
public void dofilter(servletrequest request、servletresponse応答、フィルターチェーンチェーン)がioexception、servletexception; // intercept requestをスローします
この方法は、実際のフィルタリング操作を完了します。クライアントがフィルターに関連付けられたURLへのアクセスを要求すると、サーブレットフィルターは最初にDoFilterメソッドを実行します。フィルターチェーンパラメーターは、後続のフィルターにアクセスするために使用されます。
public void Destroy(); // Destroy
フィルターオブジェクトは、作成後にメモリに存在し、Webアプリケーションが削除されるか、サーバーが停止すると破壊されます。 Webコンテナの前に呼び出されると、フィルターオブジェクトがアンインストールされます。この方法は、フィルターのライフサイクル中に1回のみ実行されます。この方法では、フィルターで使用されるリソースを解放できます。
filterconfigインターフェイス
フィルターを構成するとき、ユーザーはフィルターの初期化パラメーターを構成できます。 Webコンテナがフィルターオブジェクトをインスタンス化し、initメソッドを呼び出すと、フィルターの初期化パラメーターをカプセル化するFilterConfigオブジェクトを渡します。したがって、開発者がフィルターを作成すると、FilterConfigオブジェクトメソッドを介して次のコンテンツを取得できます。
string getfiltername(); //フィルター名を取得します。 string getInitParameter(String name); //展開の説明で指定された名前で初期化パラメーターの値を返します。存在がない場合は、nullを返します。 Enumeration getInitParameternames(); //フィルターのすべての初期化パラメーターの名前の列挙セットを返します。 public servletcontext getServletContext(); //サーブレットコンテキストオブジェクトへの参照を返します。
フィルターユースケース
フィルターを使用して、ユーザーログインセキュリティコントロールを確認します
私はしばらく前にプロジェクトの維持に参加しました。ユーザーがシステムを終了した後、彼は履歴にアクセスするためにアドレスバーに行きました。 URLによると、彼はまだシステム応答ページを入力できます。私はチェックして、リクエストがフィルタリングされておらず、ユーザーのログインがログインしていることを確認しました。フィルターを追加して問題を解決します!
最初にweb.xmlで構成します
<filter> <filter-name> sessionfilter </filter-name> <filter-class> com.action.login.sessionfilter </filter-class> <init-name> logonstrings </param-name> <! - ログインページをフィルタリングしないでください - > <param-value>/project/index.jsp; <param-name> includestrings </param-name> <! - 指定されたフィルターパラメーターの接尾辞のみをフィルタリング - > <param-value> .do; .jsp </param-value> </init-param> <init-param> <param-name> redirectpath </param> < <init-param> <param-name> DisableTestFilter </param-name> <! - y:無効フィルター - > <param-value> n </param-value> <! - http://www.manongjc.com/article/1613.html-> </initparam> </filter-mapping> <フィルター - マッピング> <フィルター> <url-pattern>/*</url-pattern> </フィルターマッピング>
次に、filterservlet.javaを書きます:
パッケージcom.action.login; import java.io.ioexception; import javax.servlet.filter; import javax.servlet.filterchain; Import javax.servlet.filterconfig; Import javax.servlet.servletexception; Import javax.servletest.servletest.servletest.servletest.servletest.servletest.servletestest.servletestest.servletestest.servletestest javax.servlet.http.httpservletrequest; import javax.servlet.httpservletresponse; Import javax.servlet.httpsertresponsewrapper; http://www.manongjc.com/article/1613.html */public class sessionfilterはフィルター{public filterconfig config; public void Destroy(){this.config = null; } public static boolean iscontains(string container、string [] regx){boolean result = false; for(int i = 0; i <regx.length; i ++){if(container.indexof(regx [i])!= -1){return true; }} return result; } public void dofilter(servletRequest request、servletResponse応答、フィルターチェーンチェーン)IoException、servletexception {httpservletrequest hrequest =(httpservletrequest)request; httpservletresponsewrapper wrapper = new httpservletResponseWrapper((httpservletResponse)応答); string logonstrings = config.getInitParameter( "logonstrings"); //ログインにログインページ文字列includestrings = config.getInitParameter( "includestrings"); //リソースの接尾辞パラメーターのフィルター文字列redirectpath = hrequest.getContextPath() + config.getInitParameter( "redirectpath"); //ターンページにログインしない文字列disableTestfilter = config.getInitParameter( "DisableTestFilter");戻る; } string [] logonlist = logonstrings.split( ";"); string [] includeList = includestrings.split( ";"); if(!this.iscontains(hrequest.getRequesturi()、includeList)){//指定されたフィルターパラメーターサフィックスChain.dofilter(request、response);戻る; } if(this.iscontains(hrequest.getRequesturi()、logOnlist)){// login page chen.dofilter(request、response)をフィルタリングしないでください。戻る; } string user =(string)hrequest.getSession()。getAttribute( "useronly"); //ユーザーがif(user == null){wrapper.sendredirect(redirectpath);戻る; } else {Chain.dofilter(request、response);戻る; }} public void init(filterconfig filterconfig)servletexception {config = filterconfig; }}このようにして、ユーザーへのすべてのリクエストを完了し、ユーザーログインをこのフィルターを介して検証する必要があります。
中国の文字化けフィルターを防ぎます
プロジェクトがSpringフレームワークを使用するとき。エンコードのために現在のJSPページとJavaコードで異なる文字セットが使用されると、フォームの送信データまたは中国名ファイルのアップロード/ダウンロードに関する文字化された問題があります。次に、このフィルターを使用できます。
<filter> <filter-name>エンコード</filter-name> <filter-class> org.springframework.web.filter.characterencodingfilter </filter-class> <init-param> <param-name>エンコード</param-name> <! <param-name> counteCoding </param-name> <! - true:リクエストが文字セットを指定したかどうかに関係なく、エンコードが使用されます。 false:リクエストが文字セットを指定した場合、エンコードは使用されません - > <param-value> false </param-value> </init-param> </filter> <filter-name>エンコード</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Spring+Hibernate's OpenSessionInviewFilterは、セッションのスイッチを制御します
Hibernate+Springがそれと併用される場合、Lazy = Trueが設定されている場合(遅延荷重)、データを読み取ると、Hibernateは親データを読み取った後に自動的にセッションを閉じます。このようにして、関連するデータと子データを使用する場合、システムはLazyinitエラーをスローします。この時点で、Springが提供するOpenSessionInviewFilterフィルターを使用する必要があります。
OpenSessionInviewFilterは、主にリクエストがクライアントにすべてのページを送信するまでセッション状態を維持し、怠zyなロードによって引き起こされる問題を解決するために、リクエストが完了するまでセッションを閉じません。
注:OpenSessionInviewFilter構成は、Struts2の構成の前に記述する必要があります。 Tomcatコンテナはフィルターのロード時に順番にロードされているため、構成ファイルが最初にStruts2のフィルター構成を書き込み、次にOpenSessionInviewFilterフィルター構成を書き込む場合、データを取得するときにSpringで管理されていません。
<フィルター> <! - 春に有効になっているレイジーロード - > <filter-name> opensessioninviewfilter </filter-name> <filter-class> org.springframework.orm.hibernate3.support.opensessionininviewfilter </filter-class> <init-name> sessionfactorybeanname </param-name> <デフォルトでは、IDを搭載したBeanは、スプリングコンテナのSessionFactoryです。 IDがSessionFactoryでない場合は、次のように設定する必要があります。ここでは、SessionFactoryはスプリングコンテナの豆です。 - > <param-value> sessionFactory </param-value> </init-param> <init-name> singlessession </param-name> singless </param-name> <! - singlessession default default balse、opensessioninviewに設定されていない場合、それはopensessionview-> <param-value> true </param-> </init-param> </filter maps> <filter-name> opensessionInviewfilter </filter-name> <url-pattern>*
struts2のweb.xml構成
プロジェクトでStruts2を使用するには、要求を傍受するためにWeb.xmlでフィルターを構成し、処理のためにStruts2のアクションに移動する必要もあります。
注:2.1.3以前にstruts2バージョンで、フィルターはorg.apache.struts2.dispatcher.filterdispatcherを使用します。それ以外の場合は、org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilterを使用します。 Struts 2.1.3から始めて、ActionContextCleanupフィルターは放棄されますが、対応する機能はStrutSpreAndExecuteFilterフィルターに含まれています。
3つの初期化パラメーターが構成されています。
<! - struts 2.xフィルター - > <filter> <filter-name> struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter </filter-class> </filter> <filter-name> sruts2 </filter-name> <url-pattern>*。</url-pattern> </filter-mapping>をdo
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!