springMVC中多个自定义拦截器方法的执行顺序

1,正常执行时(即:所有的preHandle()函数都返回true)

    springMVC中提供了接口来帮助我们自定义拦截器。我们只需要继承org.springframework.web.servlet.handler.HandlerInterceptorAdapter类或者实现org.springframework.web.servlet.HandlerInterceptor接口然后实现相应的方法就可以自定义拦截器了。 
   在写好了拦截器类后,在springMVC的配置文件中添加类似的配置信息就可以拦截具体的url。

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="com.zkw.interceptor.loginInterceptor.testInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

<mvc:interceptors> 的标签中还可以针对不同的匹配路径指定多个拦截器,类似的如下所述

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="com.zkw.interceptor.loginInterceptor.tsetInterceptor" />
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.zkw.interceptor.loginInterceptor.test1Interceptor" />
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.zkw.interceptor.loginInterceptor.test2Interceptor" />
        </mvc:interceptor>
    </mvc:interceptors>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

当匹配多个路径时,拦截器的执行顺序是什么样的呢? 
  针对上述配置,分别创建了三个拦截器LoginInterceptor、testInterceptor、test1Interceptor, 
每个拦截器的代码大致相同。

package com.zkw.interceptor.loginInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class testInterceptor extends HandlerInterceptorAdapter{
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        int a = 0;
        System.out.println("第一个拦截器preHandle");
        return true;
    }

    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2, ModelAndView arg3) throws Exception {
        System.out.println();
        System.out.println("第一个拦截器的postHandle");
    }

    public void afterCompletion(HttpServletRequest arg0,
            HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println();
        System.out.println("第一个拦截器的afterCompletion");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

当输入一个url后,控制台打印结果如下: 
这里写图片描述

由此可见:拦截器正常执行时拦截器方法的执行顺序为:配置文件中在前面的拦截器的preHandle()方法先执行,然后根据配置文件中拦截器的顺序依次执行拦截器的preHandle()方法,等所有拦截器的preHandle()方法执行完成后,逆序执行每个拦截器的postHandle()方法,当所有postHandle()方法执行完成后,再逆序执行afterCompletion()方法

2,非正常执行时(即:在执行拦截器时,有的拦截器的preHandle()返回false)

修改上述springMVC的配置文件拦截器的顺序以及匹配的路径。

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/main/**"/>
            <bean class="com.zkw.interceptor.loginInterceptor.testInterceptor" />
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/main/**"/>
            <bean class="com.zkw.interceptor.loginInterceptor.test1Interceptor" />
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="com.zkw.interceptor.loginInterceptor.LoginInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在浏览器输入localhost:8080/spiderAndAnalysis/main/index地址,将匹配以上三个拦截器。运行的结果如下: 
这里写图片描述 
这里只是改变了拦截器的顺序,其他的代码一点都没有变。从运行的结果可以看出在执行完三个拦截器的preHandle()函数之后,就突然跳到第三个拦截器的afterCompletion()方法,然后执行第二个拦截器的afterCompletion()方法就结束了。这是因为在我的程序中执行到第一个拦截器的preHandle()方法的时候,返回了false。所以当拦截器非正常执行完成时,会直接跳过所有拦截器的postHandle()函数,然后再逆向的执行preHandle()函数返回为true时的afterCompletion()方法。

猜你喜欢

转载自blog.csdn.net/weixin_39214481/article/details/80030609
今日推荐