Spring3 MVC 攔截器攔截不到的問題

攔截器:

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中的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章