設計模式之責任鏈模式思考題(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 {


    }

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