设计模式之责任链模式思考题(servlet中filter过滤器是如何实现的?)

对责任链不熟悉的朋友们可以参考我上一篇文章:
设计模式之责任链模式

问题:
servlet中的过滤器是这样的:

在这里插入图片描述

如何实现过滤器,使其处理request时是f1,f2,f3,f4的顺序,处理response时的顺序是f4,f3,f2,f1?
解答:

建立新的Resquest,Response类用来模拟请求与响应

class Request{
    String str;
}
class Response{
    String str;
}

修改接口,改为三个参数,第三个为当前的FilterChain,后面有解释:

interface Filter{
    boolean doFilter(Request request, Response response, FilterChain chain);
}

修改FilterChain类,添加index,记录此时filter执行到了第几个,doFilter中判断,如果等于filters.size(),那么就是已经执行完了,返回false,否则取出当前的filter执行doFilter:

class FilterChain implements Filter{
    List<Filter> filters = new ArrayList<>();
    int index = 0;
    public FilterChain add(Filter filter)
    {
        filters.add(filter);
        return this;
    }
    @Override
    public boolean doFilter(Request request, Response response, FilterChain chain) {
        if (index == filters.size())
            return false;
        Filter filter = filters.get(index);
        index++;
        return filter.doFilter(request, response, chain);
    }
    //删除filter等等一系列方法...
}

修改过滤器的各个类,doFilter中,首先先执行对requset的过滤,然后调用chain.doFilter,过滤器向后执行,当过滤器执行完后,会逐层返回,返回后就会执行response的过滤,实现逆序的过滤:

class ShitFilter implements Filter{

    @Override
    public boolean doFilter(Request request, Response response, FilterChain chain) {
        request.str += "---shit";
        chain.doFilter(request,response,chain);
        response.str += "---response shit";
        return true;
    }
}

class WtfFilter implements Filter{

    @Override
    public boolean doFilter(Request request, Response response, FilterChain chain) {
        request.str += "---wtf";
        chain.doFilter(request,response,chain);
        response.str += "---response wtf";
        return true;
    }
}
class FuckFilter implements Filter{

    @Override
    public boolean doFilter(Request request, Response response, FilterChain chain) {
        request.str += "---fuck";
        chain.doFilter(request,response,chain);
        response.str += "---response fuck";
        return true;
    }
}
class BitchFilter implements Filter{

    @Override
    public boolean doFilter(Request request, Response response, FilterChain chain) {
        request.str += "---bitch";
        chain.doFilter(request,response,chain);
        response.str += "---response bitch";
        return true;
    }
}

在这里插入图片描述
可以看到执行结果是shit,wtf,fuck,bitch----->bitch,fuck,wtf,shit

看到这里是不是感觉很熟悉,没错,这与servlet的过滤器大体一样。
这是servlet中的过滤器:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "CharsetFilter")
public class CharsetFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        /*过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理*/
       
        chain.doFilter(req, resp);//交给下一个过滤器或servlet处理
    }

    public void init(FilterConfig config) throws ServletException {


    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章