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


昨天項目組有個成員使用攔截器的時候發現不起作用,后來發現了原因,在這里跟大家分享一下(主要是沖突了)。分享的是一位網友寫的文章,他總結的很好。

com.zk.interceptors.MyInterceptor 實現了 HandlerInterceptor接口,可以攔截@RequestMapping注解的類和方法(也可以繼承HandlerInterceptorAdaptor)

第一種方式(攔截正常)

 

    <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>
<mvc:annotation-driven />

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM