攔截器:
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中的方法