如果有多个拦截器,执行的顺序是在SpringMVC的配置文件里的前后顺序。
<mvc:interceptors> <bean class="com.neuedu.interceptor.Inteceptor1"></bean> <mvc:interceptor> <mvc:mapping path="/test"/> <bean class="com.neuedu.interceptor.Inteceptor2"></bean> </mvc:interceptor> </mvc:interceptors>
第一个拦截器在前面就先执行第一个拦截器的preHandle方法。
第一个拦截器
package com.neuedu.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class Inteceptor1 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub System.out.println("first-preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("first-postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("first-afterCompletion"); } }
这样第二个拦截器:
package com.neuedu.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class Inteceptor2 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub System.out.println("second-preHandle"); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("second-postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("second-afterCompletion"); } }
请求的方法:
@Controller public class BController { @RequestMapping(value="/test") public void test(){ // System.out.println("目标方法执行"); } }
执行的结果:
first-preHandle
second-preHandle
目标方法执行
second-postHandle
first-postHandle
second-afterCompletion
first-afterCompletion
结果说明多拦截器的顺序是:
先执行第一拦截器的preHandle
然后第二个拦截器的preHandle
目标方法的方法
第二个拦截器的postHandle
第一个拦截器的postHandle
第二个拦截器的afterCompletion
第一个拦截器的afterCompletion