HandlerInterceptorAdapter
拦截器HandlerInterceptor接口有三个回调方法(注释是翻译的源码英文注释,可能略有拗口) 1.preHandle方法
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
2.postHandle方法,
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception;
3.afterCompletion方法,
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;
实际例子解释运行链条
spring-servlet.xml
<mvc:interceptors>
<bean class="com.interceptor.RateLimitInterceptor">
<property name="urlProperties">
<props>
<prop key="/api/test">200</prop>
</props>
</property>
</bean>
<bean class="com.interceptor.LoginInterceptor"/>
<bean class="com.interceptor.AuthInterceptor">
<constructor-arg index="0" value="#{app.mainSite}"/>
<constructor-arg index="1" value="#{app.context}"/>
<constructor-arg index="2" value="#{app.mode}"/>
<constructor-arg index="3" ref="jedisTemplate"/>
<constructor-arg index="4" value="#{app.domain}"/>
<constructor-arg index="5" value="#{app.htphead}"/>
</bean>
</mvc:interceptors>
拦截器的执行顺序:
执行结果
每个拦截器的三个方法里面都加了打印---------- 1.所有拦截器的preHandle都为true的运行结果如下: 运行链条:
2.前两个拦截器prehandle为true,第三个的prehandle为false,结果如下: 运行链条: 3.controller方法抛异常
总结
运行流程总结如下:
1、拦截器执行顺序是按照Spring配置文件中定义的顺序而定的。
2、会先按照顺序执行所有拦截器的preHandle方法,一直遇到return false为止,比如第二个preHandle方法是return false,则第三个以及以后所有拦截器都不会执行。若都是return true,则按顺序加载完preHandle方法。
3、然后执行主方法(自己的controller接口),若中间抛出异常,则跟return false效果一致,不会继续执行postHandle,只会倒序执行afterCompletion方法。
4、在主方法执行完业务逻辑(页面还未渲染数据)时,按倒序执行postHandle方法。若第三个拦截器的preHandle方法return false,则会执行第二个和第一个的afterCompletion方法。(postHandle和afterCompletion都是倒序执行) 下一篇将针对RateLimitInterceptor限流拦截器,进行详细讲解。
|