在本文中,我将向您展示如何用Tomcat中的非干扰性机制替换web.xml中声明的过滤器。
我是Apache Tomcat的好朋友。 在许多情况下,甚至企业应用程序也可以使用简单的JSP运行-servlet容器,而Tomcat则通过了所有标准的演变,并实现了飞速发展。 这并不是说其他容器是不好的(例如,Jetty,非常擅长嵌入),只是我对Tomcat足够了解,知道它是稳定的并且定期提供错误修正:这是在企业中使用产品的条件。 与大型胖应用程序服务器相比,为什么这么少的Tomcat在生产中运行,我总是感到惊讶。 是因为它太简单了吗? 但是,它会非常强大,正如我将在Valve的概念中展示的那样。
设计人员和架构师了解“ 拦截过滤器”模式:这些过滤器拦截请求和响应,并且可以链接在一起。 此模式的实现是从Servlet v2.3开始可用的javax.servlet.Filter接口。 让我们举个例子:假设使用经典的JAAS登录进行身份验证时,您必须在数据库中获取其他信息(例如名称等)。 由于您的应用程序不负责执行检查,因此无法在正确的时间获取这些信息。 使用过滤器非常简单。
第一个问题:您不希望开发人员为每个新应用程序编写数据库访问代码。 您只需创建一次过滤器,然后将其放入JAR,并告诉您的团队一劳永逸地在其web.xml中使用此过滤器。 现在您的企业不断发展,并将与人相关的信息放入LDAP服务器中(这不是一个坏主意)。 对于新创建的应用程序,您可以创建另一个访问LDAP的过滤器,并从现在开始使用它。
第二个问题:您如何处理使用旧版过滤器的应用程序?
- 您可以运行批处理来更新整个文件系统中的web.xml。 好吧,对我来说,这太冒险了......我不想大张旗鼓地降低我的作品! 而且,如果Web应用程序以非爆炸模式运行,则不可能。
- 您仍然可以使用数据库并创建一个批处理,以将LDAP服务器中的数据同步到数据库。 完全没有风险。 20年后的今天,您的信息系统成了一大团意大利面,因为信息无处不在。 不太城市化。
- 最后,您可以从一开始就依赖我们的Tomcat朋友,从应用程序中完全删除该过滤器,并在Tomcat本身中放置一个称为阀门的特定过滤器。 一个很大的缺点是您现在已经耦合到Tomcat。 这并不像听起来那样糟糕,因为代码是如此孤立,可以安全,快速地迁移到另一个应用服务器API。
我想疯狗会选择选项1,每两年更换一次的经理会选择选项2。当然,从我对解决方案的清晰主观介绍中,您可以猜到我会选择选项3。
Valve是与特定容器关联的请求处理组件。 通常,一系列阀门相互关联成管道。
— Tomcat的Javadoc
http://tomcat.apache.org/tomcat-6.0-doc/api/index.html
阀门的设计具有非常通用的接口org.apache.catalina.Valve
。 Tomcat还提供了可以安全扩展的抽象类org.apache.catalina.valves.ValveBase
。 后者的主要方法是invoke()
方法,您可以在其中访问请求和响应。 别忘了在其中调用下一个阀,或者像在过滤器中那样,链接将停止。
从这一点开始,您可以自由选择:访问LDAP服务器,放置cookie,记录性能等。
您可以在此处找到2个非常简单的示例的Maven源代码。
请注意,这些链接指向最新的v6.0版本,但是上述暴露的概念在v5.5和v4.1中可用。
更进一步:
翻译自: https://blog.frankel.ch/tomcats-valve-an-alternative-to-filter/