この記事は著者 ( Huakai Pinellia )の作品の内容を引用しています。よく書かれていると思います。簡単に見られるように記録し、消えないようにします。詳細については、原著者を確認してください。同時に、その他の分かりやすいブログ記事も集めていますので、インターセプター、フィルター、リスナーの実行シーケンス(インターセプトされた個人フィルター)
の理解を促進するために、興味のある方はご覧くださいhttps://javaforall .cn/128546.htmlここは栽培アカデミーの小教室の裏側です、すべての共有文章はここから来ています
[背景の紹介] [知識分析] [よくある質問] [解決策] [コーディングの実践] [思考の拡張] [その他のディスカッション] [参考文献]
バックエンドの知識/スキルを 8 つの側面から徹底分析 この記事で共有されるのは次のとおりです。
[インターセプター、フィルター、リスナーの機能はそれぞれ何ですか? 】
こんにちは。私は IT 育成アカデミー鄭州支部の 10 期生で、正直で純粋で心優しい JAVA プログラマーです。
今日は、Cultivation Academy 公式サイト JAVA タスク 5、思考を広げるための知識ポイント - インターセプター、フィルター、リスナーの機能とは何ですか? を共有したいと思います。
1. 背景の紹介
1.フィルター
サーブレットコンテナに依存します。この実装では関数コールバックに基づいてほぼすべてのリクエストをフィルタリングできますが、コンテナの初期化時に呼び出されるフィルタ インスタンスが 1 つだけであるという欠点があります。フィルターを使用する目的は、フィルター内の文字コードを変更するなどのフィルター操作を実行して、目的のデータを取得することです。フィルタ内の http サーブレット リクエストのいくつかのパラメータを変更します。これには、下品なテキストや危険なテキストなどのフィルタリングが含まれます。
2.インターセプター
Webフレームワークに依存し、SpringMVCの場合はSpringMVCフレームワークに依存します。実装における Java ベースのリフレクションは、スライス指向プログラミング (AOP) の操作です。インターセプターは Web フレームワークの呼び出しに基づいているため、Spring の依存多重化を使用して一部のビジネス操作を実行できます。さらに、インターセプター インスタンスは、コントローラーのライフサイクル中に複数回呼び出すことができます。ただし、その欠点は、ブロックできるのはコントローラーのリクエストのみで、静的リソースへの直接アクセスなどの他のリクエストはブロックできないことです。
3.リスナー
Web リスナーは、開発者が Web 上の特定のイベントを監視するのに役立つサーブレットの特別なクラスです。javax.servlet.servletcontextlistener インターフェースを実装するサーバー側プログラムは、Web APP アプリケーションの開始時に開始され、一度だけ初期化され、Web APP アプリケーションの停止時に破棄されます。主な役割は、リクエスト、セッション、アプリケーションなどのプロパティの初期化と変更を検知することです。
2. 知識分析
1. インターセプターの使用
プロジェクトで使用: インターフェイスを実装するクラス springMVC.xml で構成
フィルターは HandlerInterceptor または WebRequestInterceptor を実装し、適切な prehandle(…)、postHandle)、および afterCompletion) メソッドを使用します。
(1) リクエストを処理する前に preHandle メソッドが呼び出されます。したがって、このメソッドを使用して初期化前の操作を実行したり、現在のリクエストを前処理したり、リクエストを続行するかどうかを決定するための判断を行うことができます。このメソッドの戻り値はブール型で、false が返された場合はリクエストが終了し、後続のインターセプターとコントローラーが実行されなくなることを示します。戻り値が true の場合は、次のインターセプターの事前ハンドル メソッドの呼び出しを続けます。それが最後のインターセプターの場合は、現在のリクエストのコントローラー メソッドを呼び出します。
)2) postHandle メソッドは、名前が示すように、現在のリクエストを処理した後、つまりコントローラー メソッドを呼び出した後、ディスパッチャー サーブレットがレンダリング用のビューを返す前に実行されます。
)3) リクエスト全体が完了した後、つまり DispatcherServlet が対応するビューをレンダリングした後、afterCompletion メソッドを実行します。このメソッドの主な目的は、リソースを整理することです。
2. フィルターを使用する
プロジェクトで使用: インターフェイスを実装するクラス web.xml に構成を記述します。
フィルターは javax.servlet.filter を実装し、 dofilter(...)、init)、destroy) メソッドをオーバーライドするだけで済みます。
doFilter メソッドを実装して、リクエストまたはレスポンスのフィルタリングを完了します。
init メソッドを実装し、フィルターの初期化パラメーターを読み取ります。
destroy ()、フィルタを破棄するときに特定の操作を実行します
3. リスナーを使用する
プロジェクトで使用: インターフェイスを実装するクラス springMVC.xml で構成
リスナーインターフェースは主に4~8種類あり、リクエストドメイン、セッションドメイン、アプリケーションドメインの生成、破棄、属性変更を監視できます。
リスニング オブジェクトを作成します。
)1) ServletContext: 主に servletContext の作成を監視し、ServletContextListener インターフェイスを実装する必要があります。
)2) ServletRequest: 主にリクエストの作成を監視し、ServletRequestListener インターフェースを実装する必要があります。
)3) http セッション: 主にセッションの作成を監視し、http セッション リスナー インターフェイスを実装する必要があります。
プロパティの変更を受信します。
)1) ServletContext: 主に、servletContext 属性の変更、追加、削除をインターセプトし、ServletContextAttrbuteListener インターフェイスを実装する必要があります。
)2) サーブレット リクエスト: 主に
リクエスト t 属性の変更、追加、削除を監視し、ServletRequestAttrbuteListener インターフェイスを実装する必要があります; (3) HttpSession: 主にセッション属性の変更、追加、削除を監視し、必要なHttpSessionAttrbuteListener インターフェイスを実装します。
セッションのアクティブ化とパッシベーションの監視: httpSessionActivationListener は主にセッションのアクティブ化とパッシベーションを監視します。
セッションとオブジェクト間のバインディングを監視する: httpSessionBindingListener は、セッションとオブジェクト間のバインディングを監視します。
3. よくある問題と解決策
インターセプター、フィルター、リスナーの違いは何ですか?
1. 懸念の観点から: フィルタは、フィルタの範囲内の Web リクエストをインターセプトし、一部の情報に対応する変更を加えます。リスナーはシステム レベルのパラメータの監視に基づいて動作し、通常は変更を加えません。
2. サポートされるサポートに関して: インターセプターには Spring サポートが必要で、フィルターとリスナーにはサーブレットのサポートが必要です。
3. さまざまなアプリケーションシナリオ
(1) インターセプター: 非ログインログ、監査ログなどを傍受します。
(2) フィルタ: 文字エンコーディング、URL レベルの権限アクセス制御、機密単語のフィルタリング、応答情報の圧縮などを設定します。
(3) リスナー: オンラインの人数をカウントし、期限切れのセッションをクリアします。
4. コーディングの練習
詳細についてはビデオをご覧ください。
5. 思考の拡大
1. インターセプター、フィルター、リスナーの実行順序
リスナー > フィルター > インターセプター > サーブレットの実行 > インターセプター > フィルター > リスナー
2. 複数のインターセプタ(2つ)の実行順序
(1) 両方のインターセプタがリリース操作を実装する場合、順序は preHandle 1、preHandle 2、postHandle 2、postHandle 1、afterCompletion 2、afterCompletion 1 です。
(2) 最初のインターセプタ preHandle が false を返した場合、つまりインターセプトされた場合、2 番目のインターセプタはまったく実行されず、最初のインターセプタは preHandle 部分のみを実行します。
(3) 最初のインターセプタ preHandle が true を返し、2 番目のインターセプタ preHandle が false を返す場合、順序は preHandle 1、preHandle 2、afterCompletion 1 になります。
3. 複数のフィルタの実行順序
Web サーバーは、web.xml 内のフィルターの登録順序に基づいて最初に呼び出すフィルターを決定します。最初のフィルターの doFilter メソッドが呼び出されると、Web サーバーはフィルター チェーンを表す FilterChain オブジェクトを作成し、それをメソッドに渡します。 doFilter メソッドで、開発者が FilterChain オブジェクトの doFilter メソッドを呼び出すと、Web サーバーは FilterChain オブジェクトに別のフィルタがあるかどうかを確認します。ある場合は 2 番目のフィルタが呼び出されます。ない場合は、ターゲット リソースが呼び出されます。呼ばれます。
4. 複数のリスナーの実行順序
WebServlet に複数のリスナーがある場合、サーブレット リスナーはロードされた順序でロードされ、登録されます。
7. さらなる議論
1. カスタム アノテーションを使用してインターセプターを実装するにはどうすればよいですか?
まずカスタムアノテーションを定義する必要があります
@Target(ElementType.METHOD )
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessRequired {
}
ここでの ElementType.METHOD は、メソッドに対して有効であることを意味します
RetentionPolicy.RUNTIME
一般に、実行時にアノテーション情報を動的に取得する必要がある場合は、RUNTIME アノテーションのみを使用できます。
次に、独自のインターセプターを作成するときに、それを web.xml ファイルで構成する必要もあります。
最後に、インターセプトする必要があるメソッドをカスタム アノテーションでマークして、このメソッドがインターセプトされる必要があることを示します。
2. ログインしていない場合、または VIP ではない場合は、10 分以内に問題の解決を試みることができますか?
ビデオをセグメントに分割します。最初の 10 分間が 1 つのリクエストであり、その後再度リクエストが行われ、後続のリクエストはインターセプトされます。
3. インターセプターとフィルターの違い:
(1) インターセプタは Java のリフレクション メカニズムに基づいており、フィルタは関数コールバックに基づいています。
(2) インターセプタはサーブレットコンテナに依存しませんが、フィルタはサーブレットコンテナに依存します。
(3) インターセプターはアクション リクエストに対してのみ機能しますが、フィルターはほぼすべてのリクエストに対して機能します。
(4) インターセプターはアクション コンテキストおよび値スタック内のオブジェクトにアクセスできますが、フィルターはアクセスできません。
(5) アクションのライフサイクル内で、インターセプターは複数回呼び出すことができますが、フィルターはコンテナーの初期化時に 1 回しか呼び出すことができません。