跨多个 Web 应用程序的服务器范围功能
Posted
技术标签:
【中文标题】跨多个 Web 应用程序的服务器范围功能【英文标题】:Server-wide functionality across several web applications 【发布时间】:2011-04-03 14:23:24 【问题描述】:我需要对所有传入 Web 服务器的请求进行预处理和后处理。该功能既是 url 级别的访问限制和语言翻译,也是需要全局处理的其他特殊情况。
通常这可以通过 servlet 过滤器来实现,但是当 Web 应用程序的数量增加时,最好不要将过滤器与每个应用程序捆绑在一起,因为在对过滤器进行更改时需要重新构建和重新部署所有应用程序。
相反,我想在服务器上全局安装过滤器,我发现了两种可能的解决方案,我对其中任何一种都不满意。
在 Tomcat 上,可以在“lib”目录中部署服务器范围的过滤器,并配置服务器 web.xml 以将它们映射到传入请求。我看到的问题是任何过滤器依赖项也需要全局部署在 lib 目录中。据我了解,这可能会导致难以解决与已安装应用程序的依赖冲突。 (Does Tomcat load the same library file into memory twice if they are in two web apps?)
在主要充当代理的简单 Web 应用程序中部署过滤器至少会将过滤器与其相应的依赖项捆绑在一起。然后可以将此应用程序部署在服务器上并获取所有传入请求,然后使用 crossContext 配置参数将它们转发到目标应用程序。 (RequestDispatcher forward between Tomcat instances) 但是,这需要修改 url,以便所有链接都指向“代理”。
这些解决方案似乎都不令人满意。它们都依赖于平台,因为它们依赖于 Tomcat。它们似乎也都有可能存在的问题,需要对依赖关系进行特殊处理。
使用服务器范围功能时的最佳做法是什么?
【问题讨论】:
选项 2 有什么问题? Sitemesh 以类似的方式装饰多个 Web 应用程序,“代理 Web 应用程序”URL 对最终用户来说是不可见的。见opensymphony.com/sitemesh/install.html和raibledesigns.com/rd/entry/use_sitemesh_to_decorate_multiple 这听起来像是我正在寻找的解决方案。我试图准确地理解你的意思。 1. 将 sitemesh.jar 放入 tomcat/lib 2. 创建并部署一个包含全局过滤器并执行全局页面装饰的装饰器 Web 应用程序(我也需要) 3. 部署其他 Web 应用程序如果我理解正确,传入的请求将发送到目标 Web 应用程序和装饰器应用程序。 【参考方案1】:这是我未经测试的想法(因此不是最佳实践) - 这是您列表中选项 2 的变体。
您可以使用Sitemesh(这实际上是为了用一个共同的页眉/页脚装饰您的多个网络应用程序 - 但在这种情况下不要使用页眉/页脚)。
使用 crossContext = true 托管 Sitemesh as a separate web app。
Sitemesh 将作为每个 Web 应用程序的过滤器被调用,因此最终用户看到的 URL 根本不会改变。但是您必须为每个 Web 应用程序定义 decortaor.xml。
您可以编写实际的过滤器处理器并将其链接到 Sitemesh 过滤器之后。所有请求都将首先发送到 Sitemesh 应用程序 - 然后发送到您的过滤器 - 然后发送到 Web 应用程序中的单个 servlet。
【讨论】:
以上是关于跨多个 Web 应用程序的服务器范围功能的主要内容,如果未能解决你的问题,请参考以下文章
跨多个应用服务计划覆盖 Microsoft Azure 应用服务上的 MachineKey
如何跨同一个 Web 应用程序的多个实例存储会话信息? [复制]