blog

どのようにエレガントにフィルタを実装する

どのようにそれをフィルタを実装するには、ここで私は、図からわかるように、フィルタを実現するために、あなたに出されたマップ間の関係のフィルタサブクラスを置く、あなたは直接、フィルタインターフェイスを実装...

Jul 26, 2020 · 4 min. read
シェア

前の記事では、Servletの概念を学び、この研究では、フィルタフィルタ、その名のとおり、フィルタは、Servletの間にある、傍受し、Servletの要求のためにブラウザをフィルタリングすることができます、また、ブラウザの応答のServletを変更することができます。

どのようにそれをフィルタを実装するには、ここで私は、図から見ることができるように、フィルタを実現するために、あなたに出されたマップ間の関係のフィルタサブクラスを置く、あなたは直接、フィルタインターフェイスを実装することができますまた、Httpリクエストのために彼のサブクラスを継承することができます、あなたは直接HttpFilterを継承することができます。

図から、Filter には init()、doFilter() および destroy() という 3 つの主要なメソッドがあることがわかります。キーとなるのはこの doFilter() メソッドで、これは Servlet インターフェイスの service() メソッドに似ています。リクエストがコンテナに到達すると、コンテナは Servlet の service() メソッドを呼び出す前にフィルタを適用できると判断した場合、フィルタの doFilter() メソッドを呼び出します。doFilter() で service() の前処理を行い、 FilterChain の doFilter() メソッドを呼び出すかどうかを決定できます。FilterChainのdoFilter()メソッドを呼び出した後、次のFilterを実行し、次のFilterが残っていなければServletのservice()メソッドを呼び出します。終了処理はコールスタックの順番に戻るので、FilterChainのdoFiler()メソッドの後に、Servletのservice()メソッドで後処理を行うことができます。プロセス全体を以下に示します:

次に、フィルタを実装する方法を説明します:

方法1:@WebFilterアノテーションと@ServletComponentScanアノテーションを使用します。

方法2:@Componentアノテーションを使用

ウェイ3:FilterRegistrationBeanを使用して

上記のリクエストを呼び出すと、コンソールの下に再び次のような結果が表示されます。

要件1 ---- フィルタの実行順序を指定します。

アプリケーションで複数のフィルタを定義し、それらのフィルタの実行順序を指定する場合は、@Component アノテーションと FilterRegistrationBean しか使用できません。この使用方法の詳細については、以下の図を参照してください:

要件 2 ----- フィルターの検証に失敗し、例外をスローします。

実際のプロジェクトでは、通常、統一された戻り値の情報形式を定義し、例外がスローされた場合、それはグローバルな統一された例外ハンドラを介して行われるので、フロントエンドは、戻り値の結果を受信する同じ形式であるように、具体的な例は次のとおりです:



カスタマイズされた戻り値の型


グローバルな例外処理
コントローラとフィルタでそれぞれ例外をスローすると、次のような結果になります:


コントローラでの例外処理の結果


フィルタでの例外処理

Filter内の例外はグローバル例外ハンドラによって捕捉されないため、望ましい統一された形式に処理されないことがわかります。これは、FilterがSpringコンテキスト内にないためで、統一された形式に処理するには、次のコードに示す具体例を書き換えるしかありません:

異なる実装の比較

  • Componentの方法はもっともシンプルですが、すべてのリクエストをフィルタリングします。残りの2つの方法は任意のルートに対してフィルタリングできます。
  • WebFilter の実装を使う場合、順序を指定することはできません。

springで提供されるフィルタ

上記では、どのようなフィルタ、およびフィルタを実装する方法について説明しましたが、私はあなたが、実際には、実際のプロジェクトでは、長い間、一般的に使用されるクロスドメイン処理フィルタなどのフィルタで使用されているかわからない、具体的な例を以下に示しますが、実際には、CorsFilterの本質は、フィルタであり、興味のあるパートナーは、ソースコードを見に行くことができます、その性質は、そのはFilterインターフェースの実装です。

この表は、すべてのフィルタを提供するために春ですが、フィルタの独自の定義では、実際にOncePerRequestFilterを実装することによって実現することができます。 具体的には何を実装するだけでなく、どのように各フィルタは、どのような用途を持って、詳細に次の記事になります。

Read next

ビュー描画処理とイベント配信

onResumeメソッド後のアクティビティは、コンテンツの描画を開始します。対策としては、コントロールのサイズを取得していません。 前回はActivityの起動処理について説明しましたが、今回は引き続きビューの読み込み処理について説明します。 onS...

Jul 26, 2020 · 14 min read