SpringMVC提供了拦截器机制;允许运行目标方法之前进行一些拦截工作,或者目标方法运行之后进行一些其他处理;
Filter;javaWeb
HandlerInterceptor:SpringMVC
preHandle:在目标方法运行之前调用;返回boolean;return true;(chain.doFilter())放行; return false;不放行
postHandle:在目标方法运行之后调用:目标方法调用之后
afterCompletion:在请求整个完成之后;来到目标页面(或者是报错页面)之后;
1)、正常写控制器类,拦截器类与控制器类分开写
2)、拦截器是一个接口,实现HandlerInterceptor接口;
3)、springmvc.xml配置拦截器
4)、拦截器的运行流程
1、单个拦截器
正常运行流程;
拦截器的preHandle----目标方法---拦截器postHandle---目标页面---拦截器的afterCompletion;
MyFirstInterceptor...preHandle...
test01....
MyFirstInterceptor...postHandle...
success.jsp....
MyFirstInterceptor...afterCompletion
其他流程:
1、只要preHandle不放行(return false)就没有以后的流程;
2、只要preHandle放行了,不管目标方法handler炸不炸,afterCompletion总是都会执行;
2、多个拦截器
正常流程:
Af-----------------------Bf-------------------------
先进后出,后进先出
MyFirstInterceptor...preHandle...
MySecondInterceptor...preHandle...
test01....
MySecondInterceptor...postHandle...
MyFirstInterceptor...postHandle...
success.jsp....
MySecondInterceptor...afterCompletion...
MyFirstInterceptor...afterCompletion
异常流程:
1、不放行;
1)、哪一块不放行从此以后都没有;
但是MySecondInterceptor不放行;但是他前面已经放行了的拦截器的afterCompletion总会执行;
MyFirstInterceptor...preHandle...
MySecondInterceptor...preHandle...
MyFirstInterceptor...afterCompletion
3.总结
拦截器的preHandle:是按照顺序执行(放行)
拦截器的postHandle:是按照逆序执行
拦截器的afterCompletion:是按照逆序执行;
已经放行了的拦截器的afterCompletion总会执行;