Tomcat:Web应用程序中的自定义表单验证程序,而不是独立的JAR模块。可能?

时间:2013-01-21 21:01:00

标签: tomcat form-authentication context.xml tomcat-valve

我们的Web应用程序需要使用内部特定逻辑的自定义表单身份验当前的表单身份验证器实现要求身份验证器模块(我们称之为custom.auth.jar)在Web应用程序启动之前出现在%CATALINA_HOME%/lib中。 Web应用程序使用以下context.xml指令使用该自定义身份验证器模块:

<Valve className="foo.bar.CustomAuth" characterEncoding="UTF-8"/>

据我了解Tomcat的要求,在Web应用程序启动之前,此模块custom.auth.jar必须存在于Tomcat的lib目录中,因为Web应用程序似乎不需要打包身份验证器代码使用网络存档 - 它总是试图在%CATALINA_HOMA%/lib中找到它。否则,Web应用程序根本无法启动:

SEVERE: Parse error in context.xml for /webapp
java.lang.ClassNotFoundException: foo.bar.CustomAuth

由于身份验证业务逻辑的细节和一些保护,我们不得不引入某种版本的身份验证模块,并在Web应用程序应用程序监听器中检查其版本 - 如果Web应用程序发现不兼容的版本身份验证模块(不检查Tomcat的库目录中提供的JAR文件 - 我们使用反射) - 它只是拒绝开始报告尝试启动的Web应用程序与身份验证模块之间的兼容性错误。同样,必须在context.xml中指定现有身份验证器模块。

尽管它保护了不兼容的版本,但这会带来一些主要的困难:我们无法在同一个Tomcat实例中启动同一个应用程序的另一个版本,因为这两个应用程序需要不同版本的身份验证模块。但是Tomcat的lib目录中可以有一个版本。

我的问题是:是否可以将自定义FormAuthenticator直接打包到Web应用程序中,而不需要在启动Web应用程序之前加载FormAuthenticator的单个版本?这将允许我们根据需要启动任意数量的Web应用程序版本,并且根本不会触及%CATALINA_HOME%/lib

换句话说:如何让Tomcat从Web应用程序中获取自定义身份验证器模块,而不是从其主目录库目录中获取?感谢。

1 个答案:

答案 0 :(得分:2)

webapp类加载器无法加载

Valve个类。看一下this问题的答案。

作为版本控制问题的可能解决方案,请考虑通过覆盖CATLINA_BASE环境变量来启动不同的Tomcat实例。在单独的CATALINA_HOME和CATALINA_BASE中运行记录在RUNNING.txt文件中,该文件可以在Tomcat发行版中找到。我也可以分享一个有效的配置示例。