SpringMVC和Struts2中拦截器实现思路思想

来源:互联网 发布:侠义 知乎 编辑:程序博客网 时间:2024/06/09 19:18

SpringMVC中拦截器的实现思想
springMVC中拦截器的实现主要是通过doFilte()方法的返回值(boolean)来控制拦截器是否继续向下执行,如果返回true执行,则放行到下一个拦截器或者放行到最终处理请求的方法中。如果在执行中途返回了false,则触发执行triggerAfter()方法,否则就一直执行完处理请求的那个方法再触发执行triggerAfter()方法。(注:after()方法和before()方法是在拦截请求之前和之后可以做一些事情,这里是通过拦截器来实现的,其实还可以用动态代理来实现,但是这里不进行讲述)
package org.springmvcinterceptor;

import java.util.ArrayList;
import java.util.List;

public class InterceptorExecutor {

private List<Interceptor> interceptorList=new ArrayList<>();private int interceptorIndex=-1;public InterceptorExecutor(){    interceptorList.add(new Interceptor1());    interceptorList.add(new Interceptor2());    interceptorList.add(new Interceptor3());}/** * 控制执行所有过滤器中的方法 */public void execute(){    for(int i=0;i<interceptorList.size();i++){        if(interceptorList.get(i).doFilter()){            interceptorList.get(i).before();            interceptorList.get(i).doFilter();            //记录好程序执行到哪个拦截器            interceptorIndex=i;        }else{            triggerAfter();        }    }}/** * 当doFilter方法返回false时(即程序被拦截不放行时) * 触发执行之前执行过doFilter方法的拦截器的after方法 */public void triggerAfter(){    for(int j=interceptorIndex-1;j>0;j--){        interceptorList.get(j).after();    }}

}

package org.springmvcinterceptor;

public interface Interceptor {

boolean before();boolean doFilter();void after();

}

package org.springmvcinterceptor;

public class Interceptor1 implements Interceptor {
@Override
public boolean before() {
return true;
}

@Overridepublic boolean doFilter() {    return false;}@Overridepublic void after() {}

}

package org.springmvcinterceptor;

public class Interceptor2 implements Interceptor {
@Override
public boolean before() {
return true;
}

@Overridepublic boolean doFilter() {    return false;}@Overridepublic void after() {}

}

package org.springmvcinterceptor;

public class Interceptor3 implements Interceptor {
@Override
public boolean before() {
return false;
}

@Overridepublic boolean doFilter() {    return false;}@Overridepublic void after() {}

}


Struts2中拦截器的实现
struts2中的拦截器是通过递归的方式来实现的,假设有一个A,在类的构造方法中将所有元素放到list集合中,在A方法中调用类B的bm1()方法,并将A对象自身(this)传给B类,在B类中又调用A类中的am1()方法,在B类调用A类am1()方法之前可以做一些事情,类似于拦截器的before()方法,在之后做的事情类似于拦截器的after()方法,跳出递归的条件相当于执行完了最终处理请求的方法。

public class A {

private  C c = new C();List<B> bList = new ArrayList<>();public A(){    bList.add(new B(1));    bList.add(new B(2));    bList.add(new B(3));    bList.add(new B(4));}private  int i = -1;public  void am1(){    i++;    if(i>= bList.size()) {        c.cm1();    }else {        B b = bList.get(i);        b.bm1(this);        //System.out.println("method 1 in a----" + i);    }}

}

public class B {
private int id;

public B(int id) {    this.id = id;}public  void bm1(A a){    System.out.println("method 1 in B before*****" + id);    a.am1();    System.out.println("method 1 in b after -----"  + id);}

}

public class Main {
public static void main(String[] args) {
A a = new A();
a.am1();
}
}

执行结果:

method 1 in B before*****1
method 1 in B before*****2
method 1 in B before*****3
method 1 in B before*****4
method 1 in c—–
method 1 in b after —–4
method 1 in b after —–3
method 1 in b after —–2
method 1 in b after —–1