仅将Spring HandlerInterceptor绑定到一个控制器


问题内容

使用Spring 3.0.2.RELEASE。我在com.myCompany软件包中有2个Controller。通过组件扫描激活控制器

<context:component-scan base-package="com.myCompany" />

然后我有一个拦截器通过绑定到两个控制器

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
   <property name="interceptors">
     <list>
       <ref bean="myInterceptor"/>
     </list>
   </property>
 </bean>

如何将拦截器仅绑定到一个特定的Controller或Controller内部的某些方法?背景:我要检查包含某些参数的URL

文档链接


问题答案:

当您将拦截器注入到HandlerMappingbean中时,这些拦截器将应用于该映射的每个处理程序HandlerMapping。在注释前的日子里很好,因为您只需配置多个HandlerMappingBean。但是,使用注释时,我们倾向于使用一个DefaultAnnotationHandlerMapping可以映射所有内容的模型,因此该模型不起作用。

解决方案是使用<mvc:interceptors>,您可以在其中显式将路径映射到拦截器Bean。请参阅docs和此示例:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/secure/*"/>
        <bean class="org.example.SecurityInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>