使用JavaServlets2.4来执行过滤
Servlet API早已成为企业应用开发的基石,servlet filter是J2EE家族相对较新的补充。在J2EE探索者系列的最后一篇文章中,作者Kyle Gabhart将向您介绍Servlet过滤器架构,定义过滤器的许多应用程序,并指导您完成典型过滤器实现的三个步骤。他还将透露bean的一些令人兴奋的变化,预计将由新发布的Java Servlet 2.4规范引入。
Servlet过滤器是可插入的Web组件,允许我们在Web应用程序中实现预处理和后处理逻辑。支持servlet和JSP页面的基本请求处理功能,比如日志、性能、安全、会话处理、XSLT转换等等。该过滤器最初是随Java Servlet 2.3规范一起发布的,最近定稿的2.4规范对其进行了大幅升级。在J2EE探索者系列文章的最后一篇中,我将向您介绍Servlet filter的基础知识——例如总体架构设计、实现细节和J2EE Web应用中的典型应用,以及最新Servlet规范预计将提供的一些扩展功能。
什么是Servlet过滤器?
Servlet过滤器是拦截请求和响应的小型Web组件,以便以某种方式查看、提取或操作客户机和服务器之间交换的数据。过滤器是Web组件,通常封装了一些功能。尽管这些函数很重要,但它们对于处理客户端请求或发送响应并不是决定性的。典型的例子包括记录关于请求和响应的数据、处理安全协议、管理会话属性等等。Filter提供了一种面向对象的模块化机制,将常见任务封装到可插拔组件中,这些组件由配置文件声明并进行动态处理。
Servlet结合了许多元素,这使得过滤器成为一个独特、强大和模块化的Web组件。也就是说,Servlet过滤器是:
声明性的:过滤器由Web部署描述符(web.xml)中的XML标记声明。这允许您添加和删除过滤器,而无需更改任何应用程序代码或JSP页面。
动态:过滤器由Servlet容器在运行时调用,以拦截和处理请求和响应。
灵活:过滤器广泛应用于Web处理环境,涵盖了很多最常见的辅助任务,比如日志和安全。过滤器也很灵活,因为它们可以用于对来自客户端的直接调用执行预处理和后处理,以及处理防火墙后面的Web组件之间调度的请求。最后,可以链接过滤器以提供必要的功能。
模块化:通过将应用程序处理逻辑封装到单个类文件中,过滤器定义了模块化单元,可以很容易地从请求/响应链中添加或删除这些单元。
可移植性:像Java平台的许多其他方面一样,servlet过滤器可以跨平台和容器移植,从而进一步支持Servlet过滤器的模块化和可重用性。
可重用:由于过滤器实现类和声明性过滤器配置的模块化设计,过滤器可以很容易地跨不同的项目和应用程序使用。
透明:过滤器包含在请求/响应链中,旨在补充(而不是以任何方式替代)servlet或JSP页面提供的核心处理。因此,可以根据需要添加或删除过滤器,而不会破坏servlet或JSP页面。
所以Servlet过滤器是一个模块化的可重用组件,可以通过一个配置文件灵活地声明。过滤器动态地处理传入的请求和传出的响应,并且可以透明地添加或删除它们,而无需修改应用程序代码。最后,过滤器独立于任何平台或Servlet容器,允许它们容易地部署到任何兼容的J2EE环境中。
在接下来的小节中,我们将进一步研究Servlet过滤器机制的整体设计,以及实现、配置和部署过滤器所涉及的步骤。我们还将讨论Servlet过滤器的一些实际应用。最后,我们将简要检查模型-视图-控制器(MVC)架构中包含的Servlet过滤器,从而结束本文的讨论。
Servlet架构
顾名思义,Servlet过滤器用于拦截传入的请求和/或传出的响应,并监控、修改或以某种方式处理传递的数据流。过滤器是独立的模块化组件,可以添加到请求/响应链中,也可以删除,而不会影响应用程序中的其他Web组件。过滤器只改变请求和响应的运行时处理,因此它们不应该直接嵌入到Web应用程序框架中,除非它们是通过Servlet API中定义良好的标准接口实现的。
Web资源可以被配置为没有关联的过滤器(这是默认设置),单个过滤器(这是典型情况),甚至过滤器链。那么过滤器到底是做什么的呢?像servlet一样,它接受请求并响应对象。然后,过滤器检查请求对象,并决定将请求转发给链中的下一个组件,或者中止请求并将响应直接发送回客户端。如果请求被转发,它将被传递到链中的下一个资源(另一个过滤器、servlet或JSP页面)。在这个请求设法通过过滤器链并被服务器处理之后,一个响应将以相反的顺序通过过滤器链被发送回来。这使得每个过滤器都有机会根据需要处理响应对象。
Servlet 2.3规范中首次引入过滤器时,它们只能过滤Web客户机和客户机访问的指定Web资源之间的内容。如果该资源随后将请求调度到其他Web资源,则它不能将筛选器应用于任何幕后委托的请求。2.4本规范消除了这一限制。Servlet过滤器现在可以应用于J2EE Web环境中有请求和响应对象的任何地方。因此,servlet过滤器可以应用于客户机和Servlet之间、Servlet和Servlet或JSP页面之间以及每个包含的JSP页面之间。这就是我说的能力大,灵活性强!
实现一个Servlet过滤器
。他们说,“这需要很多麻烦”。我不知道“他们”指的是谁,也不知道这句古老的谚语有多正确,但是实现Servlet过滤器确实需要三个步骤。首先,您应该编写过滤器实现类,然后将过滤器添加到Web应用程序(通过在Web部署描述符/web.xml中声明它),最后将过滤器与应用程序打包并部署它。我们将详细研究这些步骤。
1.编写一个程序来实现这个类
filter API包含3个简单的接口(又是数字3!),它们整齐地嵌套在javax.servlet包中。这三个接口是Filter、FilterChain和FilterConfig。从编程的角度来说,filter类会实现filter接口,然后在这个Filter类中使用FilterChain和FilterConfig接口。此筛选器类的引用将被传递给FilterChain对象,以允许筛选器将控制权传递给链中的下一个资源。过滤器对象将由容器提供给过滤器,以允许访问过滤器的初始化数据。
为了与我们的三步模型保持一致,过滤器必须使用三种方法来完全实现过滤器接口:
Init():当容器实例化过滤器时调用该方法。它主要用于准备过滤器进行处理。该方法接受FilterConfig类型的对象作为输入。
DoFilter():正如servlet有一个service()方法(调用doPost()或doGet())来处理请求一样,过滤器有一个处理请求和响应的方法——do filter()。该方法接受三个输入参数:ServletRequest、response和FilterChain对象。
Destroy():可以想象,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前完成。
0条评论