有这样的APP应用场景。 对于传递到后台的Request和返回页面的Response信息,如果页面上的Request包含敏感信息或危险字符串,则会影响系统,因此会编写过滤器来处理请求处理方法因信息处理而异。 如果只使用一个过滤器处理所有信息,则由于可扩展性不够,可以为不同的信息处理编写不同的过滤器,并将过滤器放入一个过滤器通道中,从而实现信息处理的“热插拔”。 这种过滤器链就像职责链,链上的每个节点都希望处理不同的功能,同时对于响应,可以在Resuest中处理
从a过滤器到d过滤器构成过滤器通道。
让我们模拟一下此servlet的过滤器通道。
首先定义接口过滤器。 因为所有过滤器都必须遵循此规范才能加载到过滤器通道中。
1 publicinterfacefilter {2} voiddofilter (请求,响应响应,过滤器通道); 3 }
接下来,创建过滤器通道和每个过滤器。
1 publicclassfilterchainimplementsfilter {2list fs=new ArrayList (; 3索引=0; 4
5
6 publicfilterchainaddfilter (滤波器) 7fs.add ) f; 8返回时间; (10 ) 10
11
12 @ override 13 publicvoiddofilter (请求响应,响应响应,过滤器通道() 14if ) index==fs.size ) ) 15filterf=fs.get(index ); 16索引; 17f.do filter (请求,响应,chain ); (十九)十九
20
21 }
1 publicclasshtmlfilterimplementsfilter {2}
3
4 @ override5publicvoiddofilter (请求响应,响应响应,过滤器通道) )6request.requeststr=request.request 8 response.responsestr='---- html---- '; 9 }10 }
1 publicclasssensitivefilterimplementsfilter {2}
3
4 @ override5publicvoiddofilter (请求响应,响应响应,过滤器通道) )6request.requeststr=request.request 8 response.responsestr='---- sensitive---'; (10 ) 10
11
12 }
最后一个测试班。
1公共类{2}
3 /**
4 *@paramargs5 */
6 publicstaticvoidmain (字符串[ ] args ) { 7字符串msg='测试,
19 }
测试结果如下(箭头为Filter的方向) :