web-dev-qa-db-ja.com

Struts 2のフィルターとインターセプター

フィルターとインターセプターの実際の違いは何ですか?インターセプターはアクションの前後に再帰的に起動し、フィルターはアクションと特定のURLパターンで起動するように構成できることを理解しています。しかし、それぞれをいつ使用するかをどのようにして知っていますか?

Struts 2で読んでいる本では、インターセプターがプッシュされているようで、チュートリアルに従って認証インターセプターを作成し、ユーザーがログインしていることを確認しています。ただし、ユーザーがアクセスできないURLにアクセスしようとすると、アクションが関連付けられていない場合、インターセプターはキャッチしません。つまり、保護したいすべてのjspにアクションを関連付ける必要があります。それは正しくないようです。

URLを処理する認証フィルターを作成して、その必要がないようにすることができますが、インターセプターのポイントは何ですか?

22
JPC

最も重要な違いは、「インターセプター」はStruts 2フレームワークの一部であり、Struts 2フレームワークによって行われる要求処理の一部にすぎないことです。一方、「フィルタ」はサーブレット仕様の一部です。つまり、これらはサーブレットAPIの一部です。 Struts 2を使用している場合、インターセプターを使用してStruts 2アクションの機能をラップする必要があります。 Webアプリへのリクエストに機能をラップしようとしているが、Struts 2で処理されていない場合は、フィルターの方が適切な場合があります。

ところで、Struts 2フレームワーク全体は、次のように、webappのデプロイメント記述子(web.xml)で宣言された、webアプリで設定されたフィルター内にデプロイされます。

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.Apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

     <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

このフィルターは、すべての要求URLパターンをキャッチするように構成されており、Struts 2フレームワーク全体へのエントリーポイントです。

お役に立てば幸いです。

45
chad

インターセプターとは?

Struts 2フレームワークは、インターセプターの概念を使用して、さまざまなアクションによるいくつかの一般的な懸念の解決策を共有します。

ご存知のように、フレームワークは、リクエストに対するサブミッションで特定のActionオブジェクトを呼び出します。ただし、アクションを実行する前に、呼び出しは他のオブジェクトによってインターセプトされ、必要な追加処理が提供されます。

同様に、Actionの実行後、呼び出しを再度インターセプトできます。この傍受オブジェクトは、Interceptorと呼ばれます。

したがって、Interceptorを使用する目的は、コントローラーレイヤーをより細かく制御できるようにし、複数のアクションに適用されるいくつかの共通ロジックを分離することです。

Struts 2フレームワークは、独自の一連のインターセプターを既に提供しており、これをアプリケーションで使用して、アクションクラスの実行の前後に必要な処理を提供できます。

その1つが、ここで説明する「エイリアスインターセプタ」です。

エイリアスインターセプター:

Alias Interceptorは、アクションチェーンの場合に使用されます。アクションの連鎖とは、最初のアクションが正常に実行された後、1つのアクションが別のアクションを呼び出すことを意味します。

このインターセプターは、名前付きパラメーターを別のパラメーター名にエイリアスします。アクションチェーンでは、2つの異なるアクションクラスが異なる名前の共通パラメーターを共有する場合、このインターセプターを使用して、2番目のアクションクラスのパラメーター名と一致する最初のアクションクラスのパラメーターにエイリアス名を指定します。

アクションのエイリアス式は、次の形式にする必要があります。

             #{ 'name1' : 'alias1' , 'name2' : 'alias2' }
4
vinay

インターセプタースタックはすべてのリクエストで起動します。
フィルターは、それらが定義されているURLにのみ適用されます。

編集-必要に応じてどちらかを使用します。リクエストごとにCookieが存在することを確認する必要があるとします。インターセプターを使用します。フィルターを使用して、(URLによって駆動される)いくつかのリクエストで外部アプリをポップアップする必要があるとしましょう。

インターセプターがより一般的に使用されるツールだと思います...

関連付けられたアクションがないURLがあるのはなぜですか?

4
hvgotcodes

Struts 2ライフサイクル/アーキテクチャに従って、フィルターの前にインターセプターは実行されません。したがって、リクエストにアクションマッピングがない場合、フィルターを通過する際に失敗します。

3
tkd

経験則として

  • フィルタは各requestの前に実行されます。 struts自体はフィルターです。
  • interceptorsは、Strutsアクションの前、後に実行できます。リクエストが_.action_で終わっていない場合は実行されません。

したがって、フィルターのいくつかの例は次のようになります。

  • jsおよびcssファイルを圧縮する場合は、インターセプターではなくフィルターを使用する必要があります。
  • 特定のIPアドレスだけがWebサイトにアクセスするようにしたい場合は、それをフィルターとして開発し、リクエストIPアドレスを確認する必要があります。
  • CSRF攻撃からサイトを保護したい場合は、リクエストのCSRFトークンをチェックするフィルターを作成する必要があります。
  • リクエスト時間ごとにサイトの応答をログに記録する場合は、フィルターを使用して前後の時間を計算できますchain.doFilter(request, response)

理論的には、独自のinterceptorsを開発してfiltersonlyを使用しなくても、Struts Webアプリケーションを開発できます。しかし、あなたは多くの問題に直面し、ボイラーフィルターをコード化します。

多くのStruts 2機能はインターセプターを使用して構築されており、struts-default.xml( https://struts.Apache.org/docs/struts-defaultxml.html )で見つけることができ、リストが役立ちますインターセプターをいつ使用できるかを確認します。 (例えば、ParametersInterceptorbeforeアクションの前に実行され、送信されたフォームの値をアクションに適用します)

インターセプターを使用している間、メッセージリソースからgetTextなどのStruts機能に簡単にアクセスでき、現在のアクション名と名前空間を取得し、アクションフローを変更できます。

上記を考慮すると、インターセプターによって開発されるいくつかのケースがあります。

  • ログインしたユーザーだけが特定のアクションにアクセスできるようにするには、インターセプターを使用してそれを開発する必要があります。
  • ユーザーがナビゲーションであるアクションを追跡する場合。インターセプターを使用して、訪問したアクションを追跡できます。
  • アクションエラーを1つのポイントで処理する場合は、すべてをキャッチするインターセプターを使用できますinvocation.invoke()

インターセプターはstrutsアクションにフィルターと責任の連鎖の設計パターンを提供し、フィルターはこのパターンをWebアプリケーション全体に提供します。

1
Alireza Fattahi

Struts 2フレームワークはサーブレットAPIに依存していません。 Struts 2アクションはコンテナに結合されていません。ほとんどの場合、サーブレットコンテキストは単純なマップとして表され、アクションを個別にテストできます。

フィルターはサーブレットAPIの一部であるため、Struts 2フレームワークはインターセプターの概念を使用して、さまざまなアクションによるいくつかの一般的な懸念に対するソリューションを共有します。

また、InterceptorおよびActionクラスのテストケースを簡単に作成できます。

0
Punit Patel