2.9. Valveの作成

2.9.1. Valveとは

Webコンテナの内部の処理として、クライアントからのリクエストをキャッチして、処理することができます。フィルターと似ていますが、Valveは、Webコンテナ自体に組み込むものである点が異なります。Webコンテナ自体に組み込むため、Valveの処理に不備があると、Webコンテナに影響を与えます。通常の処理であれば、Valveではなく フィルター を利用されることを強く推奨します。

Memo
リクエストやレスポンスのデータ処理は、フィルターを使うことを推奨します。

2.9.2. Valveのインタフェース

Valveは次に挙げるクラスを継承して作成します。
表2.2.9.2-1
クラス 説明
org.apache.catalina.valves. ValveBase ValveBaseを継承して、Valveを作成します。 invoke(Request request, Response response)メソッドにValveの処理を実装します。
インタフェース 説明
com.nec.webotx.as.web.valve.WebOTXValve WebOTXValveを実装して、Valveを作成します。 invoke(Request request, Response response)メソッド postInvoke(Request request, Response response)メソッドにValveの処理を実装します。
WebOTXValve のフィールドは次のようになっています。
表2.2.9.2-2
フィールド 説明
int INVOKE_NEXT 次のValve(サーブレット) を実行する場合は、invoke メソッドでこの値をreturnします。 サーブレット実行後に行いたい処理はpostInvoke()に実装します。
int END_PIPELINE 次のValve(サーブレット)を実行しない場合は、invoke メソッドでこの値をreturnします。 ※別途レスポンスの送出処理を行う必要があります。
WebOTXValveのインタフェースは次のようになっています。
表2.2.9.2-3
クラス 説明
public String getInfo() このValveの情報を文字列で返却します。作成したValveの説明を返却することができます。
public int invoke(Request request,Response response) throws java.io.IOException, javax.servlet.ServletException
次のValve(サーブレット)へ処理を渡すまでのValve の前処理を実装します。
public void postInvoke(Request request, Response response) throws java.io.IOException,javax.servlet.ServletException 次のValve(サーブレット)へ処理を渡してサーブレットの実行が終わり、自Valveに処理が戻ってきた場合の後処理を実装します。
Valve内で生成したRequestオブジェクトを次のValve(サーブレット)へ渡すためのインタフェースは以下となっています。
invoke()の第一引数org.apache.catalina.Requestの以下のメソッドを使用します。
表2.2.9.2-4
メソッド 説明
public void setNote(String name,Object value) 第1引数には下記に示すフィールドを指定し、第2引数にはValve内で生成した、次のValve(サーブレット)へ渡したいRequestあるいはResponseオブジェクトを指定します。
org.apache.catalina.RequestのsetNote()の第1引数に指定するフィールドは次のようになっています。
表2.2.9.2-5
フィールド 説明
org.apache.catalina.Globals.WRAPPED_REQUEST setNote()でRequestオブジェクトを渡したい場合に指定します。
org.apache.catalina.Globals.WRAPPED_RESPONSE setNote()でResponseオブジェクトを渡したい場合に指定します。
Valve内で生成したRequestオブジェクトを次のValve(サーブレット)へ渡すには、システムプロパティの設定が必要です。詳しくは [ 移行 > 移行作業 > JavaVMオプションの設定 ] の設定項目、”com.nec.webotx.enterprise.web.enablePipelineRequestResponseChain”を参照してください。

2.9.3. invokeメソッド

iinvoke メソッドでValve の前処理を実装し、postInvoke メソッドでValve の後処理を実装します。
invoke メソッドのインタフェースは次のようになります。
public int invoke(Request request, Response response) throws java.io.IOException, javax.servlet.ServletException
postInvoke メソッドのインタフェースは次のようになります。
public void postInvoke(Request request,Response response) throws java.io.IOException, javax.servlet.ServletException
ソースのサンプルを次に示します。
package org.apache.catalina.valves;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import org.apache.catalina.Request;
import org.apache.catalina.Response;
import org.apache.catalina.Container;
import org.apache.catalina.Context;
import org.apache.catalina.Wrapper;

import com.nec.webotx.as.web.valve.WebOTXValve;
 
public final class TestValve extends ValveBase implements WebOTXValve {
  //-----------------------------------------------------------Constructors
   
  /**
  * Constructor
  */

  public TestValve() {
    super();
  }
   
  //---------------------------------------------------------Public Methods
  public int invoke(Request request, Response response)
      throws java.io.IOException, javax.servlet.ServletException{
    // HttpServletRequest 取得
    ServletRequest req = request.getRequest();
    HttpServletRequest hreq = (HttpServletRequest) req;
     
    // HttpServletRequest からコンテキストパス取得
    String ctxPath = hreq.getContextPath();
     
    // HttpServletRequest からセッション取得
    HttpSession session = hreq.getSession(false);
     
    // request からこのリクエストのコンテキスト取得
    Context ctx = request.getContext();
    String ctxName = ctx.getName();

    ……サーブレット実行前の処理の実装
   
    if(….) { // サーブレットを実行させる場合
      return INVOKE_NEXT; // リクエスト処理継続
    } else { // サーブレットを実行させない場合
      return END_PIPELINE; // リクエスト処理終了
    }
  }
   
  public void postInvoke(Request request, Response response)
      throws java.io.IOException, javax.servlet.ServletException {
    ・・・・・・ サーブレットの実行が終わった後の処理
  }
}