一、springmvc拦截器
1.1、实现HandlerInterceptor接口
Public class MyHandlerInterceptor implements HandlerInterceptor{
@Override
Public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
Return false;
}
@Override
Public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
Public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
- preHandle():controller执行前调用此方法;返回true表示继续执行,返回false中止执行; 这里可以加入登录校验、权限拦截等。
-
- postHandle():controller执行后但未返回视图前调用此方法;这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示。
-
- afterCompletion():controller执行后且视图返回后调用此方法;这里可得到执行controller时的异常信息;这里可记录操作日志,资源清理等。
1.2、自定义两个拦截器
- OneInterceptor类
public class OneInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle ----- one");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle ----- one");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion ----- one");
}
}
- TwoInterceptor
public class TwoInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle ----- two");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle ----- two");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("postHandle ----- two");
}
}
注意:这两个拦截器的preHandle方法返回值均是true
1.3、springmvc.xml配置
<!--注册自定义拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截所有请求-->
<mvc:mapping path="/**"/>
<bean class="com.chuan.core.config.OneInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<!--拦截所有请求-->
<mvc:mapping path="/**"/>
<bean class="com.chuan.core.config.TwoInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
1.4、测试
- 控制台打印
从上可知:OneInterceptor 拦截器的preHandle方法在TwoInterceptor拦截器之前执行,但是后面两个方法却是TwoInterceptor拦截器优先执行。
二、多个拦截器执行流程分析
2.1、多个拦截器执行流程图
- 从上可知:请求先从执行拦截器1的preHandler方法,再执行拦截器2的preHandler方法;但是返回的时候顺序恰好相反。
2.2、简单测试
1、OneInterceptor类的preHandler返回值设置为true,TwoInterceptor类的preHandler返回值设置为false
- 控制台打印
2、OneInterceptor类的preHandler返回值设置为false,TwoInterceptor类的preHandler返回值设置为true
3、OneInterceptor类的preHandler返回值设置为false,TwoInterceptor类的preHandler返回值设置为false
4、由上述三种测试情况可知
- 如果拦截器一返回了false,则拦截器肯定不会继续向下执行,只会运行拦截器一的preHandler方法,符合上述流程图逻辑;但是拦截器一返回了true,无论拦截器二返回true或者false,均会执行拦截器一的afterCompletion方法,这个情况显然是与流程图逻辑相悖的。
2.3、拦截器执行流程原理分析
- 源码分析参照此博客:springmvc拦截器原理分析