MVC拦截器
MVC的拦截器作用机制,首先,需要实现HandlerInterceptor
接口方法,这个接口里有三个方法:
public class MyFirstInterceptor implements HandlerInterceptor {
@Override
// 预执行方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyFirstInterceptor...preHandle");
return true;
}
// 执行完目标方法后执行的方法
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyFirstInterceptor...postHandle");
}
// 执行完毕postHandle后再次执行的方法
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyFirstInterceptor...afterCompletion");
}
}
产生的问题:
- 正常:单个拦截器方法与目标方法的执行顺序
- 正常:多个拦截器方法与目标方法的执行顺序
- 异常流程:不放行时的拦截器方法与目标方法的执行情况
1-正常:单个拦截器方法与目标方法的执行顺序
- 拦截器
preHandle
方法首先执行,并返回true
放行; - 目标方法执行;
- 拦截器
postHandle
方法执行; - 拦截器
afterCompletion
方法执行;
2-正常:多个拦截器方法与目标方法的执行顺序
配置两个拦截器,为了便于表述,命名为FirstInterceptor
(A)与SecondInterceptor
(B),则它们的执行顺序为:
-
FirstInterceptor
的preHandle
方法首先执行,返回true
-
SecondInterceptor
的preHandle
方法首先执行,返回true
-
目标方法执行
-
SecondInterceptor
的postHandle
方法执行 -
FirstInterceptor
的postHandle
方法执行 -
SecondInterceptor
的afterCompletion
方法执行 -
FirstInterceptor
的afterCompletion
方法执行
执行完毕,流程示意图如下:
3-异常流程:不放行时的拦截器方法与目标方法的执行情况
- 当某个拦截器的
preHandle
方法返回false
的情况下,目标方法不会执行 - 但拦截器在
preHandle
放行的方法,对应的afterCompletion
依旧执行