由浅入深讲解责任链模式,理解Tomcat的Filter过滤器

2019-08-07| 发布者: admin| 查看: |

public class demo4 {
 public static void main {
 string msg = 大家好 :), script haha /script 我要说超级敏感的话 //以下三行模拟一个请求
 request request = new request;
 request.setrequeststr;
 response response = new response;//响应
 filterchain fc = new filterchain;//过滤器链
 htmlfilter f1 = new htmlfilter;//创建过滤器
 sensitivefilter f2 = new sensitivefilter;
 expressionfilter f3 = new expressionfilter;
 fc.add;//把过滤器添加到过滤器链中
 fc.add;
 fc.add;
 fc.dofilter;//直接调用过滤器链的dofilter方法进行处理
 system.out.println);
interface filter{
 public void dofilter;
class filterchain implements filter{
 private list filter list = new arraylist ;
 private int index = 0;
 public filterchain add{
 this.list.add;
 return this;
 @override
 public void dofilter {
 if){
 return;//这里是逆序处理响应的关键, 当index为容器大小时, 证明对request的处理已经完成, 下面进入对response的处理.
 filter f = list.get;//过滤器链按index的顺序拿到filter
 index++;
 f.dofilter;
class htmlfilter implements filter{
 @override
 public void dofilter {
 request.setrequeststr.replace.replace);
 system.out.println;//调用过滤器链的dofilter方法, 让它去执行下一个filter的dofilter方法, 处理response的代码将被挂起
 system.out.println {
 request.setrequeststr.replace);
 system.out.println;
 system.out.println {
 request.setrequeststr.replace , ^_^ ));
 system.out.println;
 system.out.println {
 return requeststr;
 public void setrequeststr {
 this.requeststr = requeststr;
class response{
 private string responsestr;
 public string getresponsestr {
 return responsestr;
 public void setresponsestr {
 this.responsestr = responsestr;
}

 

class htmlfilter implements filter{
 @override
 public void dofilter {
 request.setrequeststr.replace.replace);
 system.out.println;//调用过滤器链的dofilter方法, 让它去执行下一个filter的dofilter方法, 处理response的代码将被挂起
 //在返回的过程中执行response
 system.out.println方法后, 首先会对request请求进行处理, 然后又调用了过滤器链的dofilter方法. 这就是整个责任链模式的精妙之处, 它解释了为什么要给dofilter加上一个过滤器链参数, 就是为了让每个过滤器可以调用过滤器链本身执行下一个过滤器.
为什么要调用过滤器链本身? 因为当调用过滤器本身后, 程序将跳转回到过滤器链的dofilter方法执行, 这时index为1, 也就是拿到第二个过滤器, 然后继续处理.
正是由于这个跳转, 使得过滤器中对response的处理暂时无法执行, 它必须等待上面的对过滤器链的方法返回才能被执行.
所以最后我们将看到response响应被过滤器3, 2, 1执行.