フィルターとインターセプターの実際の違いは何ですか?インターセプターはアクションの前後に再帰的に起動し、フィルターはアクションと特定のURLパターンで起動するように構成できることを理解しています。しかし、それぞれをいつ使用するかをどのようにして知っていますか?
Struts 2で読んでいる本では、インターセプターがプッシュされているようで、チュートリアルに従って認証インターセプターを作成し、ユーザーがログインしていることを確認しています。ただし、ユーザーがアクセスできないURLにアクセスしようとすると、アクションが関連付けられていない場合、インターセプターはキャッチしません。つまり、保護したいすべてのjspにアクションを関連付ける必要があります。それは正しくないようです。
URLを処理する認証フィルターを作成して、その必要がないようにすることができますが、インターセプターのポイントは何ですか?
最も重要な違いは、「インターセプター」は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フレームワーク全体へのエントリーポイントです。
お役に立てば幸いです。
インターセプターとは?
Struts 2フレームワークは、インターセプターの概念を使用して、さまざまなアクションによるいくつかの一般的な懸念の解決策を共有します。
ご存知のように、フレームワークは、リクエストに対するサブミッションで特定のActionオブジェクトを呼び出します。ただし、アクションを実行する前に、呼び出しは他のオブジェクトによってインターセプトされ、必要な追加処理が提供されます。
同様に、Actionの実行後、呼び出しを再度インターセプトできます。この傍受オブジェクトは、Interceptorと呼ばれます。
したがって、Interceptorを使用する目的は、コントローラーレイヤーをより細かく制御できるようにし、複数のアクションに適用されるいくつかの共通ロジックを分離することです。
Struts 2フレームワークは、独自の一連のインターセプターを既に提供しており、これをアプリケーションで使用して、アクションクラスの実行の前後に必要な処理を提供できます。
その1つが、ここで説明する「エイリアスインターセプタ」です。
エイリアスインターセプター:
Alias Interceptorは、アクションチェーンの場合に使用されます。アクションの連鎖とは、最初のアクションが正常に実行された後、1つのアクションが別のアクションを呼び出すことを意味します。
このインターセプターは、名前付きパラメーターを別のパラメーター名にエイリアスします。アクションチェーンでは、2つの異なるアクションクラスが異なる名前の共通パラメーターを共有する場合、このインターセプターを使用して、2番目のアクションクラスのパラメーター名と一致する最初のアクションクラスのパラメーターにエイリアス名を指定します。
アクションのエイリアス式は、次の形式にする必要があります。
#{ 'name1' : 'alias1' , 'name2' : 'alias2' }
インターセプタースタックはすべてのリクエストで起動します。
フィルターは、それらが定義されているURLにのみ適用されます。
編集-必要に応じてどちらかを使用します。リクエストごとにCookieが存在することを確認する必要があるとします。インターセプターを使用します。フィルターを使用して、(URLによって駆動される)いくつかのリクエストで外部アプリをポップアップする必要があるとしましょう。
インターセプターがより一般的に使用されるツールだと思います...
関連付けられたアクションがないURLがあるのはなぜですか?
Struts 2ライフサイクル/アーキテクチャに従って、フィルターの前にインターセプターは実行されません。したがって、リクエストにアクションマッピングがない場合、フィルターを通過する際に失敗します。
経験則として
request
の前に実行されます。 struts
自体はフィルターです。interceptors
は、Strutsアクションの前、後に実行できます。リクエストが_.action
_で終わっていない場合は実行されません。したがって、フィルターのいくつかの例は次のようになります。
js
およびcss
ファイルを圧縮する場合は、インターセプターではなくフィルターを使用する必要があります。chain.doFilter(request, response)
理論的には、独自のinterceptors
を開発してfilters
onlyを使用しなくても、Struts Webアプリケーションを開発できます。しかし、あなたは多くの問題に直面し、ボイラーフィルターをコード化します。
多くのStruts 2機能はインターセプターを使用して構築されており、struts-default.xml( https://struts.Apache.org/docs/struts-defaultxml.html )で見つけることができ、リストが役立ちますインターセプターをいつ使用できるかを確認します。 (例えば、ParametersInterceptor
はbeforeアクションの前に実行され、送信されたフォームの値をアクションに適用します)
インターセプターを使用している間、メッセージリソースからgetText
などのStruts機能に簡単にアクセスでき、現在のアクション名と名前空間を取得し、アクションフローを変更できます。
上記を考慮すると、インターセプターによって開発されるいくつかのケースがあります。
invocation.invoke()
インターセプターはstrutsアクションにフィルターと責任の連鎖の設計パターンを提供し、フィルターはこのパターンをWebアプリケーション全体に提供します。
Struts 2フレームワークはサーブレットAPIに依存していません。 Struts 2アクションはコンテナに結合されていません。ほとんどの場合、サーブレットコンテキストは単純なマップとして表され、アクションを個別にテストできます。
フィルターはサーブレットAPIの一部であるため、Struts 2フレームワークはインターセプターの概念を使用して、さまざまなアクションによるいくつかの一般的な懸念に対するソリューションを共有します。
また、InterceptorおよびActionクラスのテストケースを簡単に作成できます。