Springmvc提供了拦截器机制; 允许运行目标方法之前进行一些拦截工作,或者目标方法运行之后进行一些其他处理。
Filter(过滤器)是javaweb定义的。
拦截器是springmvc定义的。
preHandle: 在目标方法运行之前调用; 返回boolean;
postHandle: 在目标方法运行之后调用
afterCompletion:在请求整个完成之后; 来到目标页面之后;资源相应之后;
1). 拦截器是一个接口
2). 实现HandlerInterceptor接口
3). 配置拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 默认拦截所有请求 -->
<bean class="com.atchina.MyFirstInterceptor"></bean>
</mvc:interceptors>
4). 拦截器的运行流程
正常运行流程
拦截器的preHandle——目标方法——拦截器的postHandle——页面———拦截器的afterCompletion
其他流程
1. 只要preHandle不放行就没有以后的流程。
2.
只要放行了, afterCompletion都会执行。
多个拦截器
正常流程
.MyFirstInterceptor..preHandle…
.MySecondInterceptor..preHandle…
….test01..目标方法…
.MySecondInterceptor..postHandle…
.MyFirstInterceptor..postHandle…
….success…jsp…
.MySecondInterceptor..afterCompletion…
.MyFirstInterceptor..afterCompletion…
拦截器的preHandle: 是按照
顺序
执行。
拦截器的postHandle: 是按照
逆序
执行。
拦截器的afterCompletion: 是按照
逆序
执行。
异常流程:
1.不放行
1). 哪一块不放行,从此以后的流程不会执行
MySecondInterceptor不放行
,但是他前面已经放行了的拦截器的afterCompletion还是会执行
。
.MyFirstInterceptor..preHandle…
.MySecondInterceptor..preHandle…
.MyFirstInterceptor..afterCompletion…
拦截器与过滤器
什么时候用拦截器? 什么时候用过滤器?
如果某些功能,需要其他组件配合完成,我们就使用拦截器;其他情况可以使用过滤器filter。