Extending Liferay
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

サーブレットフィルタの使用

サーブレット フィルターは、リクエストが到着すると前処理し、レスポンスがクライアント ブラウザーに送信される前に後処理することができます。 サーブレットに知られることなく、複数のサーブレットのリクエストとレスポンスに機能を適用できます。 一般的なフィルターの使用例を次に示します。

  • ロギング
  • 監査
  • トランザクション管理
  • セキュリティ

記述子内のパターンを使用して、フィルターをサーブレット URL にマップできます。 リクエストがこれらの URL に到着すると、フィルターによって処理されます。 フィルターチェーンを使用すると、必要な順序でフィルターを適用できます。 サーブレット フィルターを作成してデプロイする手順は次のとおりです。

サーブレットフィルタのデプロイ

新しいLiferay インスタンスを起動し、以下を実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132

http://localhost:8080でLiferayにサインインします。 メールアドレス test@liferay.com とパスワード testを使用してください。 プロンプトが表示されたら、パスワードを learnに変更します。

次に、次の手順に従って、サンプル サーブレット フィルターをダウンロードし、ビルドして、新しい Docker コンテナーにデプロイします。

  1. サンプルモジュールをダウンロードして解凍します。

    curl https://resources.learn.liferay.com/examples/liferay-m9a3.zip -O
    
    unzip liferay-m9a3.zip
    
  2. 次のgradlewコマンドを実行してJARファイルをビルドし、それを新しいDockerコンテナにデプロイします。

    cd liferay-m9a3
    
    ./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    
  3. コンテナ コンソールから、モジュールが正常にデプロイされ、起動されたことを確認します。

    STARTED com.acme.m9a3.impl_1.0.0 [1630]
    
  4. localhost:8080にアクセスして、ポートレット フィルターが動作していることを確認します。 リクエストがサーブレットに転送されるたびに、コンテナ コンソールにメソッドが正常に呼び出されたことを示すメッセージが表示されます。

    INFO  [http-nio-8080-exec-6][M9A3ServletFilter:37] Invoking #processFilter(HttpServletRequest, HttpServletResponse, FilterChain)
    

サーブレットフィルタによるリクエストのインターセプト

選択されたサーブレットにリクエストが行われるたびに、サーブレット フィルタはリクエストをインターセプトし、 processFilter メソッドを呼び出します。

  1. 独自のサーブレット フィルタを作成するには、 com.liferay.portal.kernel.servlet.BaseFilterを拡張するクラスを作成します。

    public class M9A3ServletFilter extends BaseFilter {
    
  2. 必要な機能を追加するには、 processFilter メソッドをオーバーライドします。 この例では、フィルターは呼び出されたことを示すメッセージをコンソールに出力します。

@Override
protected void processFilter(
		HttpServletRequest httpServletRequest,
		HttpServletResponse httpServletResponse, FilterChain filterChain)
	throws Exception {

	if (_log.isInfoEnabled()) {
		_log.info(
			"Invoking #processFilter(HttpServletRequest, " +
				"HttpServletResponse, FilterChain)");
	}

	httpServletResponse.addHeader(
		"X-M9A3-Servlet-Filter", httpServletRequest.getRequestURI());

	processFilter(
		M9A3ServletFilter.class.getName(), httpServletRequest,
		httpServletResponse, filterChain);
}
  1. processFilter メソッドでは、HTTP 応答にヘッダーも追加するようにしてください。 既存のヘッダーの名前でない限り、文字列には任意のテキストを使用できます。 これはキーとして機能します。
httpServletResponse.addHeader(
	"X-M9A3-Servlet-Filter", httpServletRequest.getRequestURI());
  1. その後、通常は HTTP リクエストが次のフィルターを通過して処理が完了することになります。 リクエストの処理を続行するには、 BaseFilterprocessFilter メソッドを呼び出します。
processFilter(
	M9A3ServletFilter.class.getName(), httpServletRequest,
	httpServletResponse, filterChain);
  1. クラスに @Componentという注釈を付けます。 必要な引数は 2 つあります: サービスプロパティ。 サーブレット フィルタの場合、 service 引数を Filter.classに設定する必要があります。 プロパティ 引数には、サーブレット フィルタにマップされる URL のリストと、サーブレット フィルタに固有のその他のオプションが保持されます。

    • url-pattern: リクエストとレスポンスをフィルタリングするURLパターン(必須)

    • ディスパッチャ: フィルタがリクエストにどのように適用されるかを制限するディスパッチャ列挙定数、デフォルトでは REQUEST (オプション)

    1 つのフィルターに複数のディスパッチャを追加できます。

    • servlet-filter-name: サーブレットフィルタを識別するための人間が読める名前(必須)

    • before-filterafter-filter: それぞれ、作成するカスタム フィルターの前に実行するフィルターと、後に実行するフィルターです (オプション)

    ヒント

    サーブレット フィルターの順序を変更するときは、必ず アフター フィルター絶対リダイレクト フィルターに設定することをお勧めします。 これにより、さまざまなバグのリスクが軽減されます。

    • サーブレットコンテキスト名: この値は常に空の文字列に設定する必要があります (必須)
@Component(
property = {
	"after-filter=Absolute Redirects Filter",
	"before-filter=Auto Login Filter", "dispatcher=FORWARD",
	"servlet-context-name=", "servlet-filter-name=M9A3 Servlet Filter",
	"url-pattern=/group/*", "url-pattern=/user/*", "url-pattern=/web/*"
},
service = Filter.class
)
public class M9A3ServletFilter extends BaseFilter {