Я пытаюсь реализовать клапан Tomcat (в настоящее время используется 7.0.55), который должен перехватывать каждый запрос, поступающий в службу Tomcat, независимо от соединителя и прочего, независимо от того, есть ли хост с совпадающим именем или контекстом сервлета или что-то еще.
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);
}
}
В системе разработки, тестирование локально, все работает как и прежде. Запрос на любой путь URI на моем коте «localhost» записывает эту строку журнала. В 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, и есть один развернутый контекст с именем some-webapp
.
Как сказано выше, строка журнала получает печать, когда я вызываю http://localhost:8080/some-webapp/
, что, как и ожидалось, и также печатается, когда я вызываю http://localhost:8080/non-existing-webapp/
, что также ожидаемо.
То же самое касается домена (который не настроен на сервере). .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 конвейера или чего-то еще - есть какие-нибудь мысли?
Спасибо!