サーブレットフィルタの使用
サーブレット フィルターは、リクエストが到着すると前処理し、レスポンスがクライアント ブラウザーに送信される前に後処理することができます。 サーブレットに知られることなく、複数のサーブレットのリクエストとレスポンスに機能を適用できます。 一般的なフィルターの使用例を次に示します。
- ロギング
- 監査
- トランザクション管理
- セキュリティ
記述子内のパターンを使用して、フィルターをサーブレット 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 コンテナーにデプロイします。
-
サンプルモジュールをダウンロードして解凍します。
curl https://resources.learn.liferay.com/examples/liferay-m9a3.zip -Ounzip liferay-m9a3.zip -
次の
gradlewコマンドを実行してJARファイルをビルドし、それを新しいDockerコンテナにデプロイします。cd liferay-m9a3./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq) -
コンテナ コンソールから、モジュールが正常にデプロイされ、起動されたことを確認します。
STARTED com.acme.m9a3.impl_1.0.0 [1630] -
localhost:8080にアクセスして、ポートレット フィルターが動作していることを確認します。 リクエストがサーブレットに転送されるたびに、コンテナ コンソールにメソッドが正常に呼び出されたことを示すメッセージが表示されます。INFO [http-nio-8080-exec-6][M9A3ServletFilter:37] Invoking #processFilter(HttpServletRequest, HttpServletResponse, FilterChain)
サーブレットフィルタによるリクエストのインターセプト
選択されたサーブレットにリクエストが行われるたびに、サーブレット フィルタはリクエストをインターセプトし、 processFilter メソッドを呼び出します。
-
独自のサーブレット フィルタを作成するには、
com.liferay.portal.kernel.servlet.BaseFilterを拡張するクラスを作成します。public class M9A3ServletFilter extends BaseFilter { -
必要な機能を追加するには、
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);
}
processFilterメソッドでは、HTTP 応答にヘッダーも追加するようにしてください。 既存のヘッダーの名前でない限り、文字列には任意のテキストを使用できます。 これはキーとして機能します。
httpServletResponse.addHeader(
"X-M9A3-Servlet-Filter", httpServletRequest.getRequestURI());
- その後、通常は HTTP リクエストが次のフィルターを通過して処理が完了することになります。 リクエストの処理を続行するには、
BaseFilterのprocessFilterメソッドを呼び出します。
processFilter(
M9A3ServletFilter.class.getName(), httpServletRequest,
httpServletResponse, filterChain);
-
クラスに
@Componentという注釈を付けます。 必要な引数は 2 つあります:サービスとプロパティ。 サーブレット フィルタの場合、service引数をFilter.classに設定する必要があります。プロパティ引数には、サーブレット フィルタにマップされる URL のリストと、サーブレット フィルタに固有のその他のオプションが保持されます。-
url-pattern: リクエストとレスポンスをフィルタリングするURLパターン(必須) -
ディスパッチャ: フィルタがリクエストにどのように適用されるかを制限するディスパッチャ列挙定数、デフォルトではREQUEST(オプション)
注1 つのフィルターに複数のディスパッチャを追加できます。
-
servlet-filter-name: サーブレットフィルタを識別するための人間が読める名前(必須) -
before-filterとafter-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 {