對責任鏈不熟悉的朋友們可以參考我上一篇文章:
設計模式之責任鏈模式
問題:
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 {
}
}