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;
}
@Override
public boolean doFilter() {
return false;
}
@Override
public void after() {
}
}
package org.springmvcinterceptor;
public class Interceptor2 implements Interceptor {
@Override
public boolean before() {
return true;
}
@Override
public boolean doFilter() {
return false;
}
@Override
public void after() {
}
}
package org.springmvcinterceptor;
public class Interceptor3 implements Interceptor {
@Override
public boolean before() {
return false;
}
@Override
public boolean doFilter() {
return false;
}
@Override
public 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