<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8B%A6%E6%88%AA%E8%BF%87%E6%BB%A4%E5%99%A8%E6%A8%A1%E5%BC%8F</id>
	<title>设计模式：拦截过滤器模式 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8B%A6%E6%88%AA%E8%BF%87%E6%BB%A4%E5%99%A8%E6%A8%A1%E5%BC%8F"/>
	<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8B%A6%E6%88%AA%E8%BF%87%E6%BB%A4%E5%99%A8%E6%A8%A1%E5%BC%8F&amp;action=history"/>
	<updated>2026-04-29T10:05:09Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8B%A6%E6%88%AA%E8%BF%87%E6%BB%A4%E5%99%A8%E6%A8%A1%E5%BC%8F&amp;diff=3005&amp;oldid=prev</id>
		<title>Eijux：​建立内容为“category:设计模式  == 关于 == 拦截过滤器模式（Intercepting Filter Pattern）用于'''对应用程序的请求或响应做一些“预处理”/…”的新页面</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8B%A6%E6%88%AA%E8%BF%87%E6%BB%A4%E5%99%A8%E6%A8%A1%E5%BC%8F&amp;diff=3005&amp;oldid=prev"/>
		<updated>2021-05-09T11:53:57Z</updated>

		<summary type="html">&lt;p&gt;建立内容为“&lt;a href=&quot;/%E5%88%86%E7%B1%BB:%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&quot; title=&quot;分类:设计模式&quot;&gt;category:设计模式&lt;/a&gt;  == 关于 == 拦截过滤器模式（Intercepting Filter Pattern）用于&amp;#039;&amp;#039;&amp;#039;对应用程序的请求或响应做一些“预处理”/…”的新页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:设计模式]]&lt;br /&gt;
&lt;br /&gt;
== 关于 ==&lt;br /&gt;
拦截过滤器模式（Intercepting Filter Pattern）用于'''对应用程序的请求或响应做一些“预处理”/“后处理”'''。&lt;br /&gt;
* 定义过滤器，并在把请求传给实际目标应用程序之前应用在请求上。&lt;br /&gt;
* 过滤器可以做'''认证/授权/记录日志'''，或者跟踪请求，然后把请求传给相应的处理程序。&lt;br /&gt;
&lt;br /&gt;
=== 结构 ===&lt;br /&gt;
包含以下主要角色：&lt;br /&gt;
# '''过滤器'''（Filter）：过滤器在请求处理程序执行请求之前或之后，执行某些任务。&lt;br /&gt;
# '''过滤器链'''（Filter Chain）：过滤器链带有多个过滤器，并在 Target 上按照定义的顺序执行这些过滤器。&lt;br /&gt;
# '''目标'''（Target）：Target对象是请求处理程序。&lt;br /&gt;
# '''过滤管理器'''（Filter Manager）：过滤管理器管理过滤器和过滤器链。&lt;br /&gt;
# 客户端（Client）：是向 Target 对象发送请求的对象。&lt;br /&gt;
&lt;br /&gt;
=== 示例 ===&lt;br /&gt;
创建 FilterChain、FilterManager、Target、Client 作为表示实体的各种对象。AuthenticationFilter 和 DebugFilter 表示实体过滤器。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其结构如下：&lt;br /&gt;
: [[File:J2EE 模式：拦截过滤器模式：示例.png|600px]]&lt;br /&gt;
&lt;br /&gt;
其代码如下：&lt;br /&gt;
# 过滤器接口：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public interface Filter {&lt;br /&gt;
   public void execute(String request);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 过滤器实现：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class AuthenticationFilter implements Filter {&lt;br /&gt;
   public void execute(String request){&lt;br /&gt;
      System.out.println(&amp;quot;Authenticating request: &amp;quot; + request);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class DebugFilter implements Filter {&lt;br /&gt;
   public void execute(String request){&lt;br /&gt;
      System.out.println(&amp;quot;request log: &amp;quot; + request);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Target：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class Target {&lt;br /&gt;
   public void execute(String request){&lt;br /&gt;
      System.out.println(&amp;quot;Executing request: &amp;quot; + request);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 过滤器链：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line highlight=&amp;quot;5,6,18-23&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
 &lt;br /&gt;
public class FilterChain {&lt;br /&gt;
   private List&amp;lt;Filter&amp;gt; filters = new ArrayList&amp;lt;Filter&amp;gt;();&lt;br /&gt;
   private Target target;&lt;br /&gt;
   &lt;br /&gt;
   public void setTarget(Target target){&lt;br /&gt;
      this.target = target;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   // 添加过滤器&lt;br /&gt;
   public void addFilter(Filter filter){&lt;br /&gt;
      filters.add(filter);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   public void execute(String request){&lt;br /&gt;
      // 先执行过滤器&lt;br /&gt;
      for (Filter filter : filters) {&lt;br /&gt;
         filter.execute(request);&lt;br /&gt;
      }&lt;br /&gt;
      // 再执行目标请求逻辑&lt;br /&gt;
      target.execute(request);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 过滤管理器：【维护一个“过滤器链”，并通过过滤器链实际执行请求】&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line highlight=&amp;quot;2,14&amp;quot;&amp;gt;&lt;br /&gt;
public class FilterManager {&lt;br /&gt;
   FilterChain filterChain;&lt;br /&gt;
 &lt;br /&gt;
   public FilterManager(Target target){&lt;br /&gt;
      filterChain = new FilterChain();&lt;br /&gt;
      filterChain.setTarget(target);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   public void setFilter(Filter filter){&lt;br /&gt;
      filterChain.addFilter(filter);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public void filterRequest(String request){&lt;br /&gt;
      filterChain.execute(request);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 客户端：【维护一个“过滤管理器”，通过过滤管理器执行过滤请求】&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line highlight=&amp;quot;2,9&amp;quot;&amp;gt;&lt;br /&gt;
public class Client {&lt;br /&gt;
   FilterManager filterManager;&lt;br /&gt;
 &lt;br /&gt;
   public void setFilterManager(FilterManager filterManager){&lt;br /&gt;
      this.filterManager = filterManager;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   public void sendRequest(String request){&lt;br /&gt;
      filterManager.filterRequest(request);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 测试类：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class InterceptingFilterDemo {&lt;br /&gt;
   public static void main(String[] args) {&lt;br /&gt;
      FilterManager filterManager = new FilterManager(new Target());&lt;br /&gt;
      filterManager.setFilter(new AuthenticationFilter());&lt;br /&gt;
      filterManager.setFilter(new DebugFilter());&lt;br /&gt;
 &lt;br /&gt;
      Client client = new Client();&lt;br /&gt;
      client.setFilterManager(filterManager);&lt;br /&gt;
      client.sendRequest(&amp;quot;HOME&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 输出：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
Authenticating request: HOME&lt;br /&gt;
request log: HOME&lt;br /&gt;
Executing request: HOME&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
</feed>