里面主要有三个方法:
init()初始化方法;
doFilter()方法;
该方法里有一个chain.doFilter();在他之前都属于请求过滤,在他之后都属于相应过滤!(走到该方法的时候会走去下一个过滤器,没有下一个过滤器会执行最后的servlet)
加入走了一个a.do的servlet,会先走到第一个filter,然后走到第二个filter,没有filter之后,走a.do,会再执行第二个filter中chain.filter()方法下面的代码,最后执行第一个filter的chain.filter()下面的方法.
filterServlet的执行顺序是根据web.xml中的filter-mapping的标签顺序来执行的.
要是不用web.xml中的标签来配置过滤器,是用的注解配置的话,就根据类名的ascii码值来判断先后,
destory()方法;
下面的贴上源码:
public interfance Filter{
//在这里提示一下,接口中有default 关键字的方法可以不用重写
void default init(FilterConfig var1) throws ServletException;
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
void default destroy();
}
过滤器的优先级都是比普通的servlet高的,要是filter和其他servlet有同一个请求路径,肯定是先执行filter里面的代码!
值得注意的是filter使用了责任链设计模式
我们来看一个代码如下图:
上图代码的执行顺序就和filter的执行顺序是一样的,而里面的方法调用顺序已经在编译的时候就确定了,要是你想改变顺序,就得违背ocp
原则改动源代码了.
但是!
我们的filter就不同了,过滤器在编译阶段不会确定调用顺序,我们可以在web.xml文件中动态调换顺序!所以说,我们就算要往里面添加过滤器,调换过滤器顺序,根本就不需要动我们的java程序!这就是责任链设计模式,希望以后需要这种设计需求的时候可以想到我们的filter过滤器!
责任链设计模式的核心思想:
动态组合程序的调用顺序
也正因为如此,我们一般设置过来不起路径的视乎都是用web.xml文件来设置的,否则无法发挥责任链设计模式的最大优点.