查看“设计模式:拦截过滤器模式”的源代码
←
设计模式:拦截过滤器模式
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:设计模式]] == 关于 == 拦截过滤器模式(Intercepting Filter Pattern)用于'''对应用程序的请求或响应做一些“预处理”/“后处理”'''。 * 定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。 * 过滤器可以做'''认证/授权/记录日志''',或者跟踪请求,然后把请求传给相应的处理程序。 === 结构 === 包含以下主要角色: # '''过滤器'''(Filter):过滤器在请求处理程序执行请求之前或之后,执行某些任务。 # '''过滤器链'''(Filter Chain):过滤器链带有多个过滤器,并在 Target 上按照定义的顺序执行这些过滤器。 # '''目标'''(Target):Target对象是请求处理程序。 # '''过滤管理器'''(Filter Manager):过滤管理器管理过滤器和过滤器链。 # 客户端(Client):是向 Target 对象发送请求的对象。 === 示例 === 创建 FilterChain、FilterManager、Target、Client 作为表示实体的各种对象。AuthenticationFilter 和 DebugFilter 表示实体过滤器。 其结构如下: : [[File:J2EE 模式:拦截过滤器模式:示例.png|600px]] 其代码如下: # 过滤器接口: #: <syntaxhighlight lang="java" line highlight=""> public interface Filter { public void execute(String request); } </syntaxhighlight> # 过滤器实现: #: <syntaxhighlight lang="java" line highlight=""> public class AuthenticationFilter implements Filter { public void execute(String request){ System.out.println("Authenticating request: " + request); } } </syntaxhighlight> #: <syntaxhighlight lang="java" line highlight=""> public class DebugFilter implements Filter { public void execute(String request){ System.out.println("request log: " + request); } } </syntaxhighlight> # Target: #: <syntaxhighlight lang="java" line highlight=""> public class Target { public void execute(String request){ System.out.println("Executing request: " + request); } } </syntaxhighlight> # 过滤器链: #: <syntaxhighlight lang="java" line highlight="5,6,18-23"> import java.util.ArrayList; import java.util.List; public class FilterChain { private List<Filter> filters = new ArrayList<Filter>(); private Target target; public void setTarget(Target target){ this.target = target; } // 添加过滤器 public void addFilter(Filter filter){ filters.add(filter); } public void execute(String request){ // 先执行过滤器 for (Filter filter : filters) { filter.execute(request); } // 再执行目标请求逻辑 target.execute(request); } } </syntaxhighlight> # 过滤管理器:【维护一个“过滤器链”,并通过过滤器链实际执行请求】 #: <syntaxhighlight lang="java" line highlight="2,14"> public class FilterManager { FilterChain filterChain; public FilterManager(Target target){ filterChain = new FilterChain(); filterChain.setTarget(target); } public void setFilter(Filter filter){ filterChain.addFilter(filter); } public void filterRequest(String request){ filterChain.execute(request); } } </syntaxhighlight> # 客户端:【维护一个“过滤管理器”,通过过滤管理器执行过滤请求】 #: <syntaxhighlight lang="java" line highlight="2,9"> public class Client { FilterManager filterManager; public void setFilterManager(FilterManager filterManager){ this.filterManager = filterManager; } public void sendRequest(String request){ filterManager.filterRequest(request); } } </syntaxhighlight> # 测试类: #: <syntaxhighlight lang="java" line highlight=""> public class InterceptingFilterDemo { public static void main(String[] args) { FilterManager filterManager = new FilterManager(new Target()); filterManager.setFilter(new AuthenticationFilter()); filterManager.setFilter(new DebugFilter()); Client client = new Client(); client.setFilterManager(filterManager); client.sendRequest("HOME"); } } </syntaxhighlight> # 输出: #: <syntaxhighlight lang="java" line highlight=""> Authenticating request: HOME request log: HOME Executing request: HOME </syntaxhighlight>
返回至“
设计模式:拦截过滤器模式
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息