SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

# 如何自定义

HandlerInterceptor

实现接口
SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

mvc:interceptors

配置 bean
SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

## mvc:interceptor

配置 bean
这种配置,可以指定(或者排除) 路径
SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序


## 总结

  • preHandle - 可以考虑做权限,日志,事务
  • postHandle - 可以对请求域中的属性或视图作出修改
  • afterCompletion - 释放资源

SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

## debugger 看 流程
perHandle

下图可知,perHandle 的 调用 是在 调用目标方法之前
SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序
如果,某一个拦截器的 preHandle 方法返回 false ,后面拦截器也就不继续执行了 , 之前的 (上面) DispatcherServlet doDispacher 也直接 返回
SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

postHandle

下图可知,postHandle 的调用时在:目标方法之后,渲染视图之前
SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

afterCompletion

在 processDispatchResult 中调用
SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

render 方法(渲染视图) 之后调用
SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序
SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序


# 多个拦截器下的执行顺序

## 执行结果分析

SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

## 代码角度分析

preHandle

顺序
SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

postHandle

倒序

SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

afterCompletion

从 interceptorIndex 开始(之前执行的最后一个拦截器),倒序
SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序

interceptorIndex 在哪里定义?
preHandle()方法 - 里面定义
SpringMVC - 13 - 自定义拦截器HandlerInterceptor 、多个拦截器下的执行顺序