spring mvc的执行顺序是:谨记
============================
XXX1.preHandle()
XXX2.preHandle()
XXX3.preHandle()
XXX4.preHandle()
============================
XXX4.postHandle()
XXX3.postHandle()
XXX2.postHandle()
XXX1.postHandle()
============================
XXX4.afterCompletion()
XXX3.afterCompletion()
XXX2.afterCompletion()
XXX1.afterCompletion()
============================
*************************************************************
拦截器:
com.zk.interceptors.MyInterceptor 实现了 HandlerInterceptor接口,可以拦截@RequestMapping注解的类和方法
第一种方式
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.zk.interceptors.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截正常
第二种方法,拦截不到
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<bean class="com.zk.interceptors.MyInterceptor"></bean>
</list>
</property>
</bean>
DefaultAnnotationHandlerMapping类中说Defining a DefaultAnnotationHandlerMapping also allows for registering custom interceptors。
可以通过DefaultAnnotationHandlerMapping注册自定义拦截器。可是为什么拦截不到呢?
原来第二种方式在xml中注册的DefaultAnnotationHandlerMapping,没有真正覆盖掉DispatcherServlet注册的默认DefaultAnnotationHandlerMapping。
原因就在于我的xml中多了这一行
<mvc:annotation-driven />。 它默认已经注册了DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter 。
所以去掉它后,第二种方式,第一种方式都运行正常。
<mvc:annotation-driven />元素不建议使用。
因为
<!-- 包扫描,注册了各种处理器,<mvc:annotation-driven />也有可能重复注册好多处理器。只有我们都熟悉了,再使用完全自动化吧 -->
<context:component-scan base-package="com.zk"/>
------------注册多个注解器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.zk.interceptors.MyInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.zk.interceptors.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
或
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<bean class="com.zk.interceptors.MyInterceptor"></bean>
<bean class="com.zk.interceptors.MyInterceptor2"></bean>
</list>
</property>
</bean>
执行顺序
perHandler()
perHandler2()
----------------Handler method()
postHandle2()
postHandle()
afterCompletion2()
afterCompletion()
后缀有2的为MyInterceptor2中的方法,没有的为MyInterceptor中的方法
本文详细介绍了SpringMVC中拦截器的配置方法及执行顺序,并对比了两种不同的配置方式,一种通过<mvc:interceptors>实现,另一种通过<DefaultAnnotationHandlerMapping>注册拦截器。同时探讨了拦截器注册过程中的常见问题及其解决办法。

202

被折叠的 条评论
为什么被折叠?



