定制 Tomcat 阀门配置

use*_*065 5 tomcat6 context.xml tomcat-valve

我写了一个定制的 Tomcat 阀门。(我使用的是 Tomcat 6.0.24 和 Java 1.6)这是我声明阀门的 XML 元素:

<Valve className="mypkg.MyValve"  foo="bar"/>
Run Code Online (Sandbox Code Playgroud)

当我将此声明放入 server.xml 的 Host 元素中时。Tomcat 使用值“bar”调用我的 Valve 上的 setFoo() 方法。这就是我想要发生的事情。

但是,当我将相同的声明放入 web 应用程序的 META-INF/context.xml 中的 Context 元素内时,Tomcat 会加载阀门并且阀门运行良好。但 Tomcat 从不调用 setFoo() 方法来提供阀门所需的“bar”值。

我不明白为什么 Tomcat 正确配置了在 server.xml 中声明的阀门,而不是在 context.xml 中声明的阀门。

有谁知道当我的 web 应用程序的 META-INF/context.xml 中声明了我的阀门时,如何让 Tomcat 正确配置我的阀门?

谢谢,丹

这会导致 Tomcat 加载并正确配置我的阀门:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true"
   xmlValidation="false" xmlNamespaceAware="false">

    <Valve className="mypkg.MyValve"  foo="bar"/>
</Host>
Run Code Online (Sandbox Code Playgroud)

这会导致我的阀门加载,但 Tomcat 不会为其提供配置参数“bar”:

<Context privileged="true" >
    <Valve className="mypkg.MyValve"  foo="bar"/>
</Context>
Run Code Online (Sandbox Code Playgroud)

Jos*_*seK 3

这是我经过研究的猜测。可能是你的容器Valve绑定了Host

您的定制阀门是否直接子类化org.apache.catalina.valves.ValveBase ?如果是这样,它应该有效。

getContainer()您可以尝试从您的设置中打印出Valve 上的 ,看看它是否正确识别每次设置的Catalina 容器(引擎、主机、上下文) 。

某些 Valve(例如SingleSignOn)绑定到容器,Host这意味着它无法在其他 Valve 上工作。这也适用于子类阀门。