4.6. カスタムバルブを作成する
Valve は、アプリケーションのサーブレットがフィルタリングする前に、アプリケーションの要求処理パイプラインに挿入される Java クラスです。これを使用して、リクエストを変更したり、その他の動作を実行したりできます。このタスクは、バルブを実装するために必要な基本的な手順を示しています。
手順4.3 カスタムバルブを作成する
Maven の依存関係を設定します。
次の依存関係設定をプロジェクトpom.xml
ファイルに追加します。<dependency> <groupId>org.jboss.web</groupId> <artifactId>jbossweb</artifactId> <version>7.5.7.Final-redhat-1</version> <scope>provided</scope> </dependency>
注記jbossweb -VERSION.jar
ファイルをアプリケーションに含めないでください。これは、JBoss EAP サーバーのランタイムクラスパスで JBoss モジュールとして次の場所で利用できます:EAP_HOME/modules/system/layers/base/org/jboss/as/web/main/jbossweb-7.5.7.Final-redhat-1。jar
。Valve クラスを作成します
のサブクラスを作成しますorg.apache.catalina.valves.ValveBase
。package org.jboss.samplevalves; import org.apache.catalina.valves.ValveBase; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; public class RestrictedUserAgentsValve extends ValveBase { }
invoke メソッドを実装します。
Theinvoke()
このバルブがパイプラインで実行されると、メソッドが呼び出されます。リクエストオブジェクトとレスポンスオブジェクトはパラメーターとして渡されます。ここで、要求と応答の処理と変更を実行します。public void invoke(Request request, Response response) { }
次のパイプラインステップを呼び出します。
invoke メソッドが最後に実行する必要があるのは、パイプラインの次のステップを呼び出して、変更された要求オブジェクトと応答オブジェクトを渡すことです。これは、getNext().invoke()
方法getNext().invoke(request, response);
オプション: パラメーターを指定します。
バルブを設定可能にする必要がある場合は、パラメーターを追加してこれを有効にします。これを行うには、各パラメーターにインスタンス変数とセッターメソッドを追加します。private String restrictedUserAgents = null; public void setRestricteduserAgents(String mystring) { this.restrictedUserAgents = mystring; }
完成したコード例を確認します。
これで、クラスは次の例のようになります。例4.4 サンプルカスタムバルブ
package org.jboss.samplevalves; import java.io.IOException; import java.util.regex.Pattern; import javax.servlet.ServletException; import org.apache.catalina.valves.ValveBase; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; public class RestrictedUserAgentsValve extends ValveBase { private String restrictedUserAgents = null; public void setRestrictedUserAgents(String mystring) { this.restrictedUserAgents = mystring; } public void invoke(Request request, Response response) throws IOException, ServletException { String agent = request.getHeader("User-Agent"); System.out.println("user-agent: " + agent + " : " + restrictedUserAgents); if (Pattern.matches(restrictedUserAgents, agent)) { System.out.println("user-agent: " + agent + " matches: " + restrictedUserAgents); response.addHeader("Connection", "close"); } getNext().invoke(request, response); } }