自定义Tomcat阀门配置

时间:2010-09-16 03:13:18

标签: tomcat6 context.xml tomcat-valve

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

<Valve className="mypkg.MyValve"  foo="bar"/>

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

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

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

有人知道如何在我的webapp的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>

这导致我的阀门加载,但Tomcat不会给它配置参数“bar”:

<Context privileged="true" >
    <Valve className="mypkg.MyValve"  foo="bar"/>
</Context>

2 个答案:

答案 0 :(得分:3)

这是我的研究猜测。可能是您的Valve绑定到Host容器?

您的自定义阀门是否直接继承org.apache.catalina.valves.ValveBase ?如果是这样,它应该有效。

您可以尝试从两个设置中打印出Valve上的getContainer(),看看它是否正确识别每次设置的Catalina containers (Engine, Host, Context)中的哪一个。

SingleSignOn这样的某些阀门绑定到像Host这样的容器,这意味着它不能在其他容器上工作。这也适用于子类化的阀门。

答案 1 :(得分:0)

作为启动的一部分,SetPropertiesRule将尝试为您的自定义属性查找getter。