サーブレットのフィルターとリスナーの違い(Java EE)
-
12-10-2019 - |
質問
サーブレットにはフィルターとリスナーの機能があります。フィルターとリスナーの正確な違いを知りたいです。
解決
サーブレットフィルターは、クライアントからサーブレットへのリクエストと応答の監視、リクエストと応答の変更、または監査とログに使用されます。
サーブレットリスナーは、セッションを作成したり、セッションに属性を配置したり、別のコンテナでパッシブ化してアクティブ化したりする場合、これらのイベントを購読するなど、Webコンテナ内のイベントを聴くために使用されます。リスナーを構成できます。 web.xml
, 、 例えば HttpSessionListener
.
他のヒント
フィルターは、プロセス前後のプロセス要求に使用されます。を見てください javax.servlet.Filter
Tomcat/Jboss/その他のコンテナJavadocで。
リスナーは、アプリサーバーのイベントに添付できるトリガーのようなものです(ここで用語コンテナを使用しましょう)。リスナーを使用すると、アプリケーションレベル、セッションレベル、ライフサイクルの変更、属性の変更などを追跡できます。実装されたインターフェイスは javax.servlet.Listener
インターフェース。
以下の@FNTの回答に基づいて、もう少し明確にしてみましょう。リスナーは、クライアントのリクエストを入れることなく、ライフサイクルの変更をターゲットにしています。そのため、1つのクライアントリクエストでは、リクエストが処分される前に、さらに多くのライフサイクルイベントが発生する可能性があります。例:タイムアウトのすべてのセッションを記録する必要があります。 SesionTimeTimeAutはライフサイクルイベントであり、ユーザーが何もしないことなく発生する可能性があることに注意してください。このようなシナリオの場合、リスナーが適切になります。
リクエストが届いたときにロギングの問題に。同等のリスナー(ライフサイクルイベントを読む)イベントへの新しいリクエストの直接マッピングはありません。したがって、あなたが何かを記入する場合、受信リクエストごとに、私の意見ではフィルターを使用するのは正しいものです。
Oracleからのこの素材は、もう少し明確にすることができるはずですフィルターとリスナー
Hth
フィルター 入ってくる(リクエスト)と発信(応答)値がフィルタリングされるウォーターフィルターのようなものです。
リスナー リスニング(トリガー)のようなものです - 必要に応じて、私は実行されます。
多くの場合、1つの重要な違いは見落とされがちです。リスナーは実際の物理的要求のためにトリガーされますが、フィルターはサーブレットコンテナディスパッチで動作します。 1人のリスナーの呼び出しには、複数のフィルター/サーブレットの呼び出しがある場合があります。
マッピングフィルターディスパッチャータイプ. 。リンクは少し日付が付けられています - サーブレット3.0は含まれていません Async
ディスパッチャータイプ。 Dispatcherタイプをで指定することもできます @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コンテキスト以外では使用できません。
フィルターの詳細については http://array151.com/blog/servlet-filter/
リスナー
サーブレットリスナーは、セッションを作成したり、セッションに属性を配置したり、別のコンテナでパッシブ化してアクティブ化したりする場合、これらのイベントをサブスクライブする場合など、Web.xmlでリスナーを構成できます。 、たとえば、httpsessionlistener。
リスナーは、アプリサーバーのイベントに添付できる実際の物理リクエストをトリガーされます。リスナーを使用して、アプリケーションレベル、セッションレベル、ライフサイクルの変更、属性の変更などを追跡できます。
ライフサイクルイベントが発生したときにメソッドが呼び出されるリスナーオブジェクトを定義することにより、サーブレットのライフサイクルでのイベントを監視および対応できます。
詳細については: http://array151.com/blog/servlet-listener/
そして、ここに違いがあります http://array151.com/blog/difference-between-servlet-filter-and-servlet-listener/
リスナー内の現在のイベントオブジェクトを変更できますが、リスナーでの現在のイベントハンドラーの実行を停止することはできません。また、リスナー内からイベントキューをクリアすることもできません。能力に課される違いに加えて、それらはさまざまな目的のためにも意図されています。リスナーは、イベントハンドラーとモデルの間のインタラクションに焦点を合わせる傾向がありますが、フィルターはイベントハンドラーとコントローラー間の相互作用に焦点を当てる傾向があります。
ソース : ウェブ
これら2つの英語の意味で簡単に大まかなアイデアを得ることができます。フィルターは、サーブレットに来る/外出するコンテンツ/リソースをフィルタリングするためにあります。一方、リスナーは、Webアプリケーションに何かが起こったときにいくつかの関連することをするためにそこにいます(リスニング)。
フィルター:フィルターは、クライアントからサーブレットへの応答とリクエストを単にフィルタリングするだけです。
リスナー:トリガーが発生したときのトリガーのようなものです。
要するに、
フィルターはサーブレット用で、要求と応答を傍受します。
リスナーはWebアプリケーションのためであり、コンテキストレベル、セッションレベルなどでイベントに関する重要なタスクを実行します。