系统设计与建模


J2EE核心模式 - Intercepting Filter(拦截过滤器)

2007-12-21 21:17Update
TAGS: Core | J2EE | Pattern

LifevV.COM编辑部

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
 
Copyright ©2006-2010 lifevv.com. All Rights Reserved
POWERED BY @pmplat.syboos.com