美文网首页
java web filter责任链模式模拟实现

java web filter责任链模式模拟实现

作者: zhengaoly | 来源:发表于2021-12-05 10:44 被阅读0次

我们常常用到拦截器、过虑器等等模式,但是我很少知道,其内部是怎么实现的,不了解其原理。下面就此总结 Filter 的责任链模式:

第一步,新建一个 Filter 接口:

package cn.sunline.suncard.dp;
 
/**
 * 责任链接口
 * @author    tpf
 * @version   1.0  2012-4-26
 * @see       [相关类/方法]
 * @since     [产品/模块版本] 
 */
public interface Filter {
 
    public void doFilter(Request req, Response res, FilterChain chain);
}

第二步,新建各种具体的 Filter 实现类:

package cn.sunline.suncard.dp;
 
/**
 * 敏感字符过虑器
 * @author    tpf
 * @version   1.0  2012-4-26
 * @see       [相关类/方法]
 * @since     [产品/模块版本] 
 */
public class SensitiveFilter implements Filter {
 
    @Override
    public void doFilter(Request req, Response res, FilterChain chain) {
        req.setReqStr(req.getReqStr().replace("牛B", "牛*"));
        chain.doFilter(req, res, chain);
        res.setResStr(res.getResStr()+this.getClass().getSimpleName()+"--");
    }
 
}
package cn.sunline.suncard.dp;
 
/**
 * 特殊字符过虑器
 * @author    tpf
 * @version   1.0  2012-4-26
 * @see       [相关类/方法]
 * @since     [产品/模块版本] 
 */
public class SpecialFilter implements Filter {
 
    @Override
    public void doFilter(Request req, Response res, FilterChain chain) {
        req.setReqStr(req.getReqStr().replace("$", "¥"));
        chain.doFilter(req, res, chain);
        res.setResStr(res.getResStr()+this.getClass().getSimpleName()+"--");
    }
 
}
package cn.sunline.suncard.dp;
 
/**
 * 笑脸字符过虑器
 * @author    tpf
 * @version   1.0  2012-4-26
 * @see       [相关类/方法]
 * @since     [产品/模块版本] 
 */
public class FaceFilter implements Filter {
 
    @Override
    public void doFilter(Request req, Response res, FilterChain chain) {
        req.setReqStr(req.getReqStr().replace("^_^", "●0●"));
        chain.doFilter(req, res, chain);
        res.setResStr(res.getResStr()+this.getClass().getSimpleName()+"--");
    }
 
}

第三步,新建 FilterChain 类 (实现自 Filter 接口):

package cn.sunline.suncard.dp;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * filter链
 * @author    tpf
 * @version   1.0  2012-4-26
 * @see       [相关类/方法]
 * @since     [产品/模块版本] 
 */
public class FilterChain implements Filter {
 
    private List<Filter> filters = new ArrayList<Filter>();
    int index = 0;
    
    /**
     * 添加filter
     * 修改日期:2012-4-26
     * @author: tpf
     * @param filter
     * @return
     */
    public FilterChain addFilter(Filter filter) {
        this.filters.add(filter);
        return this;
    }
    
    /**
     * 对各种Filter进行调用
     */
    @Override
    public void doFilter(Request req, Response res, FilterChain chain) {
        if(index == filters.size()) {
            return;
        }
        Filter filter = filters.get(index);
        index++;
        filter.doFilter(req, res, chain);
    }
}

第四步,还需要新建模拟的 Request 和 Response 类:

package cn.sunline.suncard.dp;
 
/**
 * 模拟请求Request
 * @author    tpf
 * @version   1.0  2012-4-26
 * @see       [相关类/方法]
 * @since     [产品/模块版本] 
 */
public class Request {
 
    private String reqStr;
 
    /**
     * @return the reqStr
     */
    public String getReqStr() {
        return reqStr;
    }
 
    /**
     * @param reqStr the reqStr to set
     */
    public void setReqStr(String reqStr) {
        this.reqStr = reqStr;
    }
}
package cn.sunline.suncard.dp;
 
/**
 * 模拟Response
 * @author    tpf
 * @version   1.0  2012-4-26
 * @see       [相关类/方法]
 * @since     [产品/模块版本] 
 */
public class Response {
 
    private String resStr;
 
    /**
     * @return the resStr
     */
    public String getResStr() {
        return resStr;
    }
 
    /**
     * @param resStr the resStr to set
     */
    public void setResStr(String resStr) {
        this.resStr = resStr;
    }
}

最后,我们写一个测试类:

package cn.sunline.suncard.dp;
 
/**
 * 责任链dp测试类
 * @author    tpf
 * @version   1.0  2012-4-26
 * @see       [相关类/方法]
 * @since     [产品/模块版本] 
 */
public class FilterTest {
 
    public static void main(String[] args) {
        String msg = "你是中国人,很牛B,月薪可以达$20000,让人羡慕哈,^_^";
        
        Filter sensitiveFilter = new SensitiveFilter();
        Filter specialFilter = new SpecialFilter();
        Filter faceFilter = new FaceFilter();
        FilterChain filterChain = new FilterChain();
        
        filterChain.addFilter(sensitiveFilter)
                   .addFilter(specialFilter)
                   .addFilter(faceFilter);
        
        Request req = new Request();
        req.setReqStr(msg);
        Response res = new Response();
        res.setResStr("[Response]");
        
        filterChain.doFilter(req,res,filterChain);
        System.out.println(req.getReqStr());
        System.out.println(res.getResStr());
    }
 
}

以上就是整个 Filter 拦截器的模拟写法,仅学习而写。

相关文章

网友评论

      本文标题:java web filter责任链模式模拟实现

      本文链接:https://www.haomeiwen.com/subject/qdyixrtx.html