サーブレットにはフィルターとリスナーの機能があります。フィルターとリスナーの正確な違いを知りたい。
サーブレットフィルターは、クライアントからサーブレットへの要求と応答の監視、要求と応答の変更、または監査とログ記録に使用されます。
サーブレットリスナーは、セッションを作成するとき、セッションに属性を配置するとき、または別のコンテナーで非アクティブ化してアクティブ化するときなど、Webコンテナーのイベントをリッスンするために使用されます。これらのイベントをサブスクライブするには、web.xml
、たとえばHttpSessionListener
。
フィルタは、処理前および処理後のリクエストに使用されます。 javax.servlet.Filter
はTomcat/jboss/otherコンテナjavadocにあります。
リスナーは、アプリサーバーのイベントにアタッチできるトリガーのようなものです(ここでは、コンテナーという用語を使用します)。リスナーを使用すると、アプリケーションレベル、セッションレベル、ライフサイクルの変更、属性の変更などを追跡できます。実装されているインターフェースはjavax.servlet.Listener
インターフェイス。
以下の@fntの回答に基づいて、もう少し詳しく説明してみましょう。リスナーは、クライアントリクエストを受信させることなく、ライフサイクルの変更を対象としています。したがって、1つのクライアントリクエストに対して、リクエストが破棄される前に、さらに多くのライフサイクルイベントが発生する可能性があります。例:タイムアウトしたすべてのセッションを記録する必要があります。 SesionTimeoutはライフサイクルイベントであり、ユーザーが何もしなくても発生する可能性があることに注意してください。このようなシナリオでは、リスナーが適切です。
リクエストが到着したときにログを記録するという質問に。同等のリスナー(読み取りライフサイクルイベント)イベントへの新しいリクエストの直接マッピングはありません。したがって、何かをログに記録する場合は、着信要求ごとに、私の意見ではフィルターを使用するのが適切です。
Oracleのこの資料は、さらに明確にする必要があります フィルターとリスナー
HTH
Filterは、着信(要求)値と発信(応答)値がフィルター処理される水のフィルターのようなものです。
リスナーはリスニング(トリガー)に似ています-必要なときはいつでも実行されます。
1つの重要な違いが見落とされることがよくあります。リスナーは実際の物理的な要求に対してトリガーされますが、フィルターはサーブレットコンテナーのディスパッチで機能します。 1つのリスナー呼び出しに対して、複数のフィルター/サーブレット呼び出しが存在する場合があります。
マッピングフィルターディスパッチャータイプ 。リンクは少し古くなっています-Servlet 3.0 Async
ディスパッチャタイプは含まれていません。 @WebFilter
アノテーションを使用してディスパッチャタイプを指定することもできます。
import javax.servlet.DispatcherType;
import javax.servlet.annotation.WebFilter;
@WebFilter(servletNames = { "My Servlet" },
dispatcherTypes = { DispatcherType.REQUEST, DispatcherType.FORWARD })
Java EE 6 からのテキスト
フィルター
フィルターは、要求と応答(ヘッダーとコンテンツ)を変換するオブジェクトです。
リスナー
ライフサイクルイベントが発生したときにメソッドが呼び出されるリスナーオブジェクトを定義することにより、サーブレットのライフサイクル内のイベントを監視して対応できます。
すべての答えとブログを読んだ後、これは私が得たものです
フィルター
フィルターは、要求または応答に含まれる情報を変換または使用するために、要求および応答を動的にインターセプトするオブジェクトです。
通常、フィルター自体は応答を作成しませんが、代わりに、あらゆるタイプのサーブレットまたはJSPページに「付加」できる汎用機能を提供します。
フィルターは、ビューをレンダリングする前に、コントローラーが応答をレンダリングした後に実行されます。
フィルターは、web.xmlで定義されているWebレイヤーでのみ使用されます。
フィルターは、要求/応答をブラックボックスシステムとして扱う場合に適しています。サーブレットの実装方法に関係なく機能します。
フィルターは、ログイン認証、Webページからの着信要求の監査、変換、ロギング、圧縮、暗号化と復号化、入力検証などのフィルタリングタスクを実行するために使用されます。
サーブレットフィルターはWebレイヤーでのみ使用され、Webコンテキストの外部では使用できません。
フィルターの詳細については http://array151.com/blog/servlet-filter/
リスナー
サーブレットリスナーは、セッションを作成するとき、セッションに属性を配置するとき、または別のコンテナーで非アクティブ化してアクティブ化するときなど、webコンテナーのイベントをリッスンするために使用され、これらのイベントをサブスクライブするためにweb.xmlでリスナーを構成できます、たとえば、HttpSessionListener。
リスナーは、アプリサーバーのイベントにアタッチできる実際の物理的なリクエストに対してトリガーされます。リスナーを使用すると、アプリケーションレベル、セッションレベル、ライフサイクルの変更、属性の変更などを追跡できます。
ライフサイクルイベントが発生したときにメソッドが呼び出されるリスナーオブジェクトを定義することにより、サーブレットのライフサイクル内のイベントを監視して対応できます。
詳細については、 http://array151.com/blog/servlet-listener/
ここに違いがあります http://array151.com/blog/difference-between-servlet-filter-and-servlet-listener/
リスナー内で現在のイベントオブジェクトを変更できますが、リスナーで現在のイベントハンドラーの実行を停止することはできません。リスナー内からイベントキューをクリアすることもできません。課された機能の違いに加えて、それらは異なる目的も意図しています。リスナーは、イベントハンドラーとモデル間の相互作用に焦点を当てる傾向があり、フィルターは、イベントハンドラーとコントローラー間の相互作用に焦点を合わせる傾向があります。
ソース: web
これら2つの英語の意味について大まかなアイデアを簡単に得ることができます。サーブレットは、サーブレットに出入りするコンテンツ/リソースをフィルタリングするためにあります。一方、リスナーはWebアプリケーションに何かが起こったときにいくつかの関連することをするためにあります(リスニング)。
Filter:Filterは、クライアントからサーブレットへの応答と要求を単にフィルタリングすることです。
リスナー:トリガーが発生したときにアクションを実行するトリガーのようなものです。
要するに、
フィルターはサーブレット用で、リクエストとレスポンスをインターセプトします。
リスナーはWebアプリケーション用であり、コンテキストレベル、セッションレベルなどのイベントで重要なタスクを実行します。