1

我们的 Web 应用程序需要内部具有特定逻辑的自定义表单身份验证。当前的表单验证器实现需要验证器模块,我们称之为它custom.auth.jar,在%CATALINA_HOME%/libWeb 应用程序启动之前存在。context.xmlWeb 应用程序使用以下指令使用该自定义身份验证器模块:

<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 应用程序中获取自定义身份验证器模块,而不是从其主库目录中获取?谢谢。

4

1 回答 1

2

Valvewebapp 类加载器无法加载类。看看这个问题的答案。

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

于 2013-01-21T22:31:57.050 回答