J2EE核心模式 - Intercepting Filter(拦截过滤器)
2007-12-21 21:17Update
Intercepting Filter模式使用一到多个过滤器(Filter)为采用拦截的方式为request/response(用户请求/服务器响应)做前处理以及后处理。Intercepting Filter一般可以用来做某些共通处理比如认证,页面导航,Session管理,国际化或本地化处理,日志等。
Intercepting Filter(拦截过滤器)模式介绍
我们从问题,解决方法,策略,优点几个方面介绍Intercepting Filter(拦截过滤器)模式。最后给出Intercepting Filter的实现范例以及相关联结。问题
表示层的请求(request)处理机制收到很多不同种类的来自客户端的请求,有些请求只是简单地被发送给目标组件,但另外一些请求必须作某些加工处理。
问题:
根据不同的状况,可能有必要对request/response做一些前处理和后处理。请确认你的应用中是否需要以下处理:
1,客户端被认证过吗?
2,客户端是否有一个正确的session?
3,客户端的IP地址是否来自一个被信任的网络?
4,request地址是否没有违反任何约束?
5,发送数据的时候客户端使用何种编码?
6,我们是否支持客户的浏览器?
等等。
因为这些原因,客户的请求在得到真正的处理或回应之前,我们的应用系统需要对它做种种判断和处理,然后决定怎么样处理或应答来自客户端的请求。
这些判断及相应处理应该在什么地方通过什么方法进行呢?
一个典型的实现方法是包含一系列的条件判断语句(比如 if/else),当任何条件失败时则退出后续处理。但这种解决方案导致代码的脆弱性以及容易产生copy-and-paste风格的程序代码,而且当条件发生改变(修改或增减条件)时,不得不修改原有的代码。
解决方法
Create pluggable filters to process common services in a standard manner without requiring changes to core request processing code. The filters intercept incoming requests and outgoing responses, allowing preprocessing and post-processing. We are able to add and remove these filters unobtrusively, without requiring changes to our existing code.
用一个标准的方式,来创建插件式(pluggable)的过滤器做某些共通处理,使用这种方式,无需改变核心的请求处理代码。这些过滤器通过对输入(request)输出(response)进行拦截,做一些前处理/后处理操作。我们能够简单地增加/移除这些过滤器而无需对原有的代码做任何修改。
Intercepting Filter模式常被用来解决以下问题:
认证
页面导航与转发等
Session管理
国际化或本地化处理
日志
其它共通处理等等。
Intercepting Filter的结构
如图:
FilterManager
FilterManager管理Filter的执行。它负责创建具有正确顺序的FilterChain,开始处理。
FilterChain
互相独立的Filter的集合。
FilterOne,FilterTwo,FilterThree
各个Filter,做request/response的前处理或后处理操作,由FilterChain协调它们的处理。
Target
客户端请求的目标资源。
策略
Intercepting Filter模式有多种实现策略:
2种基本策略
Custom Filter Strategy(自定义Filter策略)
Standard Filter Strategy(标准Filter策略)另外,在此基础之上,结合对象的抽象继承等方式,可以衍生出更加复杂的实现方法。比如Base Filter Strategy,Template Filter Strategy等。
Custom Filter Strategy(自定义Filter策略)
所谓自定义Filter策略,就是完全由自己实现Filter框架,包括FilterManager,FilterChain,以及各Filter等。实现方法请参考本文末尾给出的联结文章。
Standard Filter Strategy(标准Filter策略)
J2EE(SERVLET 2.3规范)已经为我们提供了标准的 Intercepting Filter模式的实现方法。在J2EE应用中,FilterManager与FilterChain由支持J2EE标准的WEB容器为我们实现,我们只需实现javax.servlet.Filter接口的类即可。
比如,Tomcat中,FilterManager角色的实现类是org.apache.catalina.core.StandardWrapperValve,FilterChain角色的实现类是org.apache.catalina.core.ApplicationFilterChain。由于它们支持J2EE标准,我们无需关心它们的实现细节。
优点:
使用Intercepting Filter模式有以下好处:
- 不同的功能由不同的Filter类实现,它们被松耦合地组织在一起,由FilterManager以及FilterChain集中控制。
- 提高可重用性。各Filter之间完全独立,各Filter可不加修改地分别用于不同的应用中,具有完全地可重用性。
- 高度可扩展性。通过配置文件管理Filter的增减以及与目标资源的对应关系,可以无需修改代码便可增加/移除Filter。
但由于它们之间松耦合性,它们之间的信息共享花费的代价比较高。
范例
Intercepting Filter模式标准Filter策略的实现比较简单,只需要实现javax.servlet.Filter接口,然后在web.xml里加以设置即可。介绍这方面的文章很多,文末给出的联结也有具体的实现方法,这里不再详述。
相关模式
Front Controller(J2EE核心模式的前台控制器模式) Controller与Intercepting Filter解决类似的问题。但Controller更适合控制核心处理。
Decorator [GoF] (GoF装饰模式)
Intercepting Filter模式可以使用GoF的Decorator模式来实现,该实现方法提供动态插件式的封装行为。
Template Method [GoF](GoF模板方法模式)
可以使用GoF模板方法模式实现Filter模板(the Template Filter Strategy)。
Interceptor [POSA2]
The Intercepting Filter pattern is related to the Interceptor pattern, which allows services to be added transparently and triggered automatically.
Pipes and Filters [POSA1]
The Intercepting Filter pattern is related to the Pipes and Filters pattern.
参考资料:
Core J2EE Pattern Catalog
Core J2EE Patterns - Intercepting Filter
- Relative Articles
- J2EE核心模式 - Data Access Object(数据存取对象) - (2008-01-11 23:24)
- J2EE核心模式 - Session Facade(Session外观) - (2008-01-08 23:22)
- J2EE核心模式 - Business Delegate(业务代理) - (2008-01-07 21:11)
- J2EE核心模式 - Composite View(复合视图) - (2007-12-29 10:38)
- J2EE核心模式 - Dispatcher View(视图转发器) - (2007-12-26 22:06)
- J2EE核心模式 - Service to Worker - (2007-12-26 21:52)
- J2EE核心模式 - View Helper(视图协助器) - (2007-12-26 21:39)
- J2EE核心模式 - Front Controller(前端控制器) - (2007-12-21 21:46)
- 广告投放与管理系统的功能体系结构分析 - (2007-12-18 21:38)
- 图解EJB的体系结构 - (2007-12-03 21:29)
- MVC模式 - 写在理解J2EE模式的前篇 - (2007-11-24 23:52)
- J2EE核心模式 - 概要 - (2007-11-21 00:04)