当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

跨多个Web应用程序的Java服务器范围功能

admin 140℃
我需要对所有输入到Web服务器的请求执行前处理和后处理。该功能既是URL级别的访问限制和语言翻译,也是其他需要全局处理的特殊情况。

通常,这可以通过servlet过滤器来实现,但是当web应用程序的数量增加时,最好不要将过滤器与每个应用程序捆绑在一起,因为在更改过滤器时,需要重新构建和部署所有应用程序。

相反,我想在服务器上全局安装过滤器,我发现了两种可能的解决方案,但我对其中任何一种都不满意。

  1. 在tomcat上,可以在'lib'目录中部署服务器范围的过滤器,并配置服务器web.xml将它们映射到传入的请求。我看到的问题是,任何过滤器依赖项也需要在lib目录中全局部署。据我所知,这可能导致难以解决与已安装应用程序的依赖关系冲突。(Does Tomcat load the same library file into memory twice if they are in two web apps?

  2. 在主要充当代理的简单web应用程序中部署过滤器至少会将过滤器与其对应的依赖项捆绑在一起。然后可以在服务器上部署此应用程序,并在使用crosscontext config参数将所有传入请求转发到目标应用程序之前接收它们。(RequestDispatcher forward between Tomcat instances)但是,这需要修改URL,以便所有链接指向'代理'。

这些解决办法似乎都不令人满意。它们都依赖于平台,因为它们依赖于tomcat。它们似乎都有可能出现问题,需要对依赖项进行特殊处理。

使用服务器范围的功能时,最佳做法是什么?

这是我未经测试的想法(因此不是最佳实践)-这是您列表中选项2的变体。

您可以使用Sitemesh(这实际上是指用一个公共的页眉/页脚装饰您的多个web应用程序-但在这种情况下不要使用页眉/页脚)。

用crosscontext=true托管Sitemesh as a separate web app

sitemesh将作为每个web应用程序的过滤器被调用,因此最终用户看到的url根本不会更改。但您必须为每个web应用程序定义decorator.xml。

您可以编写实际的筛选器处理器,并在sitemesh筛选器之后链接它。所有请求将首先转到sitemesh应用程序,然后转到您的筛选器,然后转到web应用程序中的单个servlet。

转载请注明:我的代码 » 跨多个Web应用程序的Java服务器范围功能