コネクタなどに関係なく、名前が一致するホストやサーブレットコンテキストなどがあるかどうかに関係なく、Tomcat サービスに到達するすべてのリクエストをインターセプトする Tomcat バルブ (現在は 7.0.55 を使用) を実装しようとしています。
invoke
バルブのメソッドは次のようになります。
public class MyValve extends ValveBase {
public void invoke(Request request, Response response) throws IOException,
ServletException {
LOG.trace("Valve is being invoked");
getNext().invoke(request, response);
}
}
ローカルでテストしている開発システムでは、すべてが例外として機能しています。「localhost」Tomcat の任意の URI パスへのリクエストは、そのログ行を書き込みます。ではsever.xml
、バルブはHost
要素の外側に設定されています。
<Server port="8005" shutdown="SHUTDOWN">
...
<Service name="Catalina">
...
<Engine defaultHost="localhost" name="Catalina">
...
<Realm ... />
<Valve className="a.b.c.MyValve" />
...
<Host ...>
</Host>
</Engine>
</Service>
</Server>
私のシステムの hosts ファイルで、ドメインtest.domain.com
が 127.0.0.1 にマップされ、 という名前のコンテキストが 1 つデプロイされているとしsome-webapp
ます。
http://localhost:8080/some-webapp/
上で述べたように、ログ行は を呼び出すとprintet を取得しますhttp://localhost:8080/non-existing-webapp/
。
同じことがドメイン (server.xml で構成されていない) test.domain.com にも当てはまるためhttp://test.domain.com/some-webapp/
、ログ行とhttp://test.domain.com/non-existing-webapp
.
しかし、これは私たちがテストしているサーバーには当てはまりません。ここで、Valve は、URI のコンテキスト名が tomcat に「既知」である場合にのみ呼び出されます。つまり、.../some-webapp/ への呼び出しはログ行を出力し、.../non-existing-webapp への呼び出しはログ行を出力します。 / は単に何もしません - バルブはまったく呼び出されません。
それでも、Tomcat は、この場合クライアントに送信される 404 に応答ヘッダーとして「Apache-Coyote something」が含まれているため、その要求を処理します。
これをさらにデバッグする方法、特にTomcatによるパイプラインの「選択」などのプロセスについてのアイデアがありません-何か考えはありますか?
ありがとう!