对责任链不熟悉的朋友们可以参考我上一篇文章:
设计模式之责任链模式
问题:
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 {
}
}