1

コネクタなどに関係なく、名前が一致するホストやサーブレットコンテキストなどがあるかどうかに関係なく、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によるパイプラインの「選択」などのプロセスについてのアイデアがありません-何か考えはありますか?

ありがとう!

4

2 に答える 2