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 {
・・・・・・ サーブレットの実行が終わった後の処理
}
}