SpringMVC自定义多个拦截器执行顺序
一、正常流程下的拦截器(全部放行)
1.springMVC中拦截器实现这个接口HandlerInterceptor
第一个拦截器 HandlerInterceptor1
-
public class HandlerInterceptor1 implements HandlerInterceptor {
-
//进入 Handler方法之前执行
-
//用于身份认证、身份授权
-
//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
-
-
public boolean preHandle(HttpServletRequest request,
-
HttpServletResponse response, Object handler) throws Exception {
-
System.out.println("HandlerInterceptor1...preHandle");
-
//return false表示拦截,不向下执行
-
//return true表示放行
-
return true;
-
}
-
//进入Handler方法之后,返回modelAndView之前执行
-
//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
-
-
public void postHandle(HttpServletRequest request,
-
HttpServletResponse response, Object handler,
-
ModelAndView modelAndView) throws Exception {
-
System.out.println("HandlerInterceptor1...postHandle");
-
}
-
//执行Handler完成执行此方法
-
//应用场景:统一异常处理,统一日志处理
-
-
public void afterCompletion(HttpServletRequest request,
-
HttpServletResponse response, Object handler, Exception ex)
-
throws Exception {
-
System.out.println("HandlerInterceptor1...afterCompletion");
-
}
-
}
第二个拦截器 HandlerInterceptor2
-
public class HandlerInterceptor2 implements HandlerInterceptor {
-
//进入 Handler方法之前执行
-
//用于身份认证、身份授权
-
//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
-
-
public boolean preHandle(HttpServletRequest request,
-
HttpServletResponse response, Object handler) throws Exception {
-
System.out.println("HandlerInterceptor2...preHandle");
-
//return false表示拦截,不向下执行
-
//return true表示放行
-
return true;
-
}
-
//进入Handler方法之后,返回modelAndView之前执行
-
//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
-
-
public void postHandle(HttpServletRequest request,
-
HttpServletResponse response, Object handler,
-
ModelAndView modelAndView) throws Exception {
-
System.out.println("HandlerInterceptor2...postHandle");
-
}
-
//执行Handler完成执行此方法
-
//应用场景:统一异常处理,统一日志处理
-
-
public void afterCompletion(HttpServletRequest request,
-
HttpServletResponse response, Object handler, Exception ex)
-
throws Exception {
-
System.out.println("HandlerInterceptor2...afterCompletion");
-
}
-
}
springMVC.xml中配置两个拦截器
-
<!--拦截器 -->
-
<mvc:interceptors>
-
<!--多个拦截器,顺序执行 -->
-
<mvc:interceptor>
-
<!-- /**表示所有url包括子url路径 -->
-
<mvc:mapping path="/**"/>
-
<bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>
-
</mvc:interceptor>
-
<mvc:interceptor>
-
<mvc:mapping path="/**"/>
-
<bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>
-
</mvc:interceptor>
-
</mvc:interceptors>
查看打印的日志信息
HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor2...postHandle
HandlerInterceptor1...postHandle
HandlerInterceptor2...afterCompletion
HandlerInterceptor1...afterCompletion
这是正常的拦截器执行流程
以上执行的拦截器是正常流程的拦截器的顺序
二、非正常情况下的拦截器(第一个拦截器放行,第二个拦截器拦截)
细心的读者会发现在拦截器中preHandle方法中的返回值我做了注解, //return false表示拦截,不向下执行//return true表示放行
-
public class HandlerInterceptor2 implements HandlerInterceptor {
-
//进入 Handler方法之前执行
-
//用于身份认证、身份授权
-
//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
-
-
public boolean preHandle(HttpServletRequest request,
-
HttpServletResponse response, Object handler) throws Exception {
-
System.out.println("HandlerInterceptor1...preHandle");
-
//return false表示拦截,不向下执行
-
//return true表示放行
-
return false;
-
}
再次启动系统拦截器的执行顺序
日志打印
HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor1...afterCompletion
总结:
拦截器1放行,拦截器2 preHandle才会执行。
拦截器2 preHandle不放行,拦截器2 postHandle和afterCompletion不会执行。
只要有一个拦截器不放行,postHandle不会执行。
二、非正常情况下的拦截器(第一个拦截器拦截,第二个拦截器拦截)
-
public class HandlerInterceptor1 implements HandlerInterceptor {
-
//进入 Handler方法之前执行
-
//用于身份认证、身份授权
-
//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
-
-
public boolean preHandle(HttpServletRequest request,
-
HttpServletResponse response, Object handler) throws Exception {
-
System.out.println("HandlerInterceptor1...preHandle");
-
//return false表示拦截,不向下执行
-
//return true表示放行
-
return false;
-
}
-
public class HandlerInterceptor2 implements HandlerInterceptor {
-
//进入 Handler方法之前执行
-
//用于身份认证、身份授权
-
//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
-
-
public boolean preHandle(HttpServletRequest request,
-
HttpServletResponse response, Object handler) throws Exception {
-
System.out.println("HandlerInterceptor2...preHandle");
-
//return false表示拦截,不向下执行
-
//return true表示放行
-
return false;
-
}
日志打印
HandlerInterceptor1...preHandle
总结
拦截器1 preHandle不放行,postHandle和afterCompletion不会执行。
拦截器1 preHandle不放行,拦截器2不执行。