java过滤器-双向过滤

6 篇文章 0 订阅
1 篇文章 0 订阅

本文主要采用java设计模式-过滤器模式,模拟双向过滤原理,封装每个request和response过滤内容,采用不定参数机制灵活实双向过滤。

  • 创建Filter接口
package filterChain;
//首先创建一个Filter接口
public interface Filter {

//doFilter处理过滤内容    
    public void doFilter ( Request request,Response response,FilterChain filterChain);

}
  • 实现Filter接口,创建FilterOne,FilterTwo。
package filterChain;
//创建FilerOne 
public class FilterOne implements Filter {
//实现doFilter方法,并封装request过滤和response过滤
    public void doFilter(Request req, Response res, FilterChain filterChain) {
        requestProcess(req);
        filterChain.doFilter(req, res);
        responseProcess(res);

    }
//request 过滤方法处理流程,如果想包装更好点可以单独封装成一个单独类
    public void requestProcess(Request req) {
        req.setMessage("FilterOne requestProcess");
        System.out.println(req.getReMessage().toString());


    }
//response 过滤方法处理流程,如果想包装更好点可以单独封装成一个单独类
    public void responseProcess(Response res) {
        res.setMessage("FilterOne responseProcess");
        System.out.println(res.getReMessage().toString());


    }

}
package filterChain;
//创建FilterTwo
public class FilterTwo implements Filter {

    public void doFilter(Request req, Response res, FilterChain filterChains) {
        requestProcess(req);
        filterChains.doFilter(req, res);
        responseProcess(res);
    }
//request 过滤方法处理流程,如果想包装更好点可以单独封装成一个单独类
    public void requestProcess(Request req) {
        req.setMessage("FilterTwo requestProcess");
        System.out.println(req.getReMessage().toString());


    }
//response 过滤方法处理流程,如果想包装更好点可以单独封装成一个单独类
    public void responseProcess(Response res) {
        res.setMessage("FilterTwo responseProcess");
        System.out.println(res.getReMessage().toString());


    }
}
  • request创建
package filterChain;

public class Request {

    private String reMessage;
//setMessage方法
    public void setMessage(String requesMessage) {  

        this.reMessage = requesMessage

    }
//getMessage方法
    public String getReMessage() {

        return reMessage;
    }
}
  • response
package filterChain;

public class Response {

    private String reMessage;
//setMessage方法
    public void setMessage(String  requesMessage ) {
        this.reMessage = requesMessage
    }
//getMessage    
    public String getReMessage() {
        return reMessage;
    }
}
  • FilterChain
package filterChain;

import java.util.ArrayList;
import java.util.List;

public class FilterChain {
    private List<Filter> filterChain = new ArrayList<Filter>();
    private int index = 0;
//增加Filter
    public void addFilter(Filter... filters) {
        if (filters != null) {
            for (Filter filter : filters) {
                this.filterChain.add(filter);
            }

        } else {
            System.out.println("null filter add");

        }

    }
//删除Filter
    public void removeFilter(Filter... filters) {

        if (filters != null) {
            for (Filter filter : filters) {
                this.filterChain.remove(filter);
            }

        } else {
            System.out.println("null filter remove");

        }

    }
//获取所有filter
    public List<Filter> getFilterChain() {
        return filterChain;
    }


    public void doFilter(Request req, Response res) {

        if (index == this.filterChain.size()) {
            index = 0;
            return;
        }
        Filter filter = this.filterChain.get(index);
        index++;

        filter.doFilter(req, res, this);

    }

}
  • 测试代码
package filterChain;

public class TestMyFileter {

    public static void main(String[] args) {
        FilterChain mFilterChain = new FilterChain();
        mFilterChain.addFilter(new FilterOne(), new FilterTwo());
        Request request = new Request();
        request.setMessage("initial request message");
        System.out.println(request.getReMessage());
        Response response = new Response();
        response.setMessage("initial response message");
        System.out.println(response.getReMessage());
        mFilterChain.doFilter(request, response);

    }
}
  • 测试结果
    initial request message
    initial response message
    FilterOne requestProcess
    FilterTwo requestProcess
    FilterTwo responseProcess
    FilterOne responseProcess

  • 补充

  • -

不足:没有实现多线程,很多地方封装的并不完善,不过通过此例能了解双向过滤机制和java责任链模式基本工作原理

  • 引用

这个案例主要思路上学堂马士兵老师的责任链模式,和tomcat 部分源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值