zoukankan      html  css  js  c++  java
  • 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中的方法

  • 相关阅读:
    委托和事件
    解决kalilinux:“下列签名无效: KEYEXPIRED 1425567400"
    【c# 学习笔记】委托的使用
    【c# 学习笔记】c#委托是什么
    【c# 学习笔记】面向对象编程的应用
    【c# 学习笔记】接口与抽象类
    【C# 开发技巧】番外篇故事-我是一个线程
    【物联网硬件安全】二、固件分析-固件逆向
    【物联网硬件安全】二、固件分析-固件提取
    【物联网硬件安全】一、硬件分析-电路分析
  • 原文地址:https://www.cnblogs.com/zrbfree/p/5626803.html
Copyright © 2011-2022 走看看