我尝试实现一个 Tomcat 阀门(当前使用 7.0.55),它应该拦截到达 Tomcat 服务的每个请求,无论连接器和诸如此类,无论是否存在具有匹配名称的主机或 servlet 上下文或其他什么。
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,并且部署了一个名为some-webapp
.
如上所述,当我调用时,日志行得到 printet http://localhost:8080/some-webapp/
,这是预期的,并且在我调用时也会打印http://localhost:8080/non-existing-webapp/
,这也是预期的。
域(未在 server.xml 中配置)test.domain.com 也是如此,因此http://test.domain.com/some-webapp/
打印日志行以及http://test.domain.com/non-existing-webapp
.
但对于我们正在测试的服务器,情况并非如此。这里只有当 URI 的上下文名称对 tomcat 是“已知的”时才调用 Valve,即调用 .../some-webapp/ 将打印日志行,而调用 .../non-existing-webapp / 根本不会做任何事情 - 根本不调用阀门。
尽管如此,在这种情况下,tomcat 仍将该请求处理为发送到客户端的 404,其中包含“Apache-Coyote something”作为响应标头。
我不知道如何进一步调试它,尤其是tomcat“选择”管道或其他任何东西的过程 - 有什么想法吗?
谢谢!