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

标签 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 要求,此模块 custom.auth.jar 必须在 Web 应用程序启动之前出现在 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 实例中启动同一个应用程序的另一个版本,因为这两个应用程序需要不同版本的身份验证模块。但是Tomcat的lib目录下可以有一个版本。

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

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

最佳答案

Valve 类不能由 webapp 类加载器加载。看看 this 的答案问题。

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

关于Tomcat:Web 应用程序中的自定义表单验证器,而不是作为独立的 JAR 模块。可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14447146/

相关文章:

maven - 在 Jenkins 插件中使用外部 dll 库

java - 在 Apache Tomcat 中发送关于 MIME 类型响应的特定 header

java - Tomcat环境下获取JDBC Driver for MySQL失败

java - 如何在同一 Java EE 应用程序中同时配置 BASIC 和 FORM 身份验证方法

java - 如何从 context.xml 注入(inject)值

xml - 错误 : This XML file does not appear to have any style information associated with it

c# - 使用 MVC 自定义身份验证

javascript - 如何向用户显示 session 过期消息

spring - Vaadin 7.4、Spring、Tomcat 7、使用@WebServlet 更改上下文根

java - 如何保护 context.xml 中的敏感信息?