我们的 Web 应用程序需要内部具有特定逻辑的自定义表单身份验证。当前的表单验证器实现需要验证器模块,我们称之为它custom.auth.jar
,在%CATALINA_HOME%/lib
Web 应用程序启动之前存在。context.xml
Web 应用程序使用以下指令使用该自定义身份验证器模块:
<Valve className="foo.bar.CustomAuth" characterEncoding="UTF-8"/>
据我了解 Tomcat 的要求,在 Web 应用程序启动之前,该模块custom.auth.jar
必须存在于 Tomcat 的lib
目录中,因为 Web 应用程序似乎不需要与 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 实例中启动同一个应用程序的另一个版本,因为这两个应用程序需要不同版本的身份验证模块。lib
但是在 Tomcat 的目录中可以有一个版本。
我的问题是:是否可以将自定义FormAuthenticator
直接打包到 Web 应用程序中,而不需要在FormAuthenticator
启动 Web 应用程序之前加载单个版本?这将允许启动我们想要的任意多个版本的 Web 应用程序,并且根本不接触%CATALINA_HOME%/lib
。
换句话说:如何让 Tomcat 从 Web 应用程序中获取自定义身份验证器模块,而不是从其主库目录中获取?谢谢。