控制器可以指定要使用的拦截器

时间:2013-12-11 11:15:09

标签: java spring-mvc controller

我正在将现有的(3.1.1)网络mvc Controller(称为LoginController)移动到使用注释,我有

<bean id="loginHandlerMapping"
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="licenseInterceptor" />
            <ref bean="propertyInterceptor" />
            <ref bean="localeChangeInterceptor" />
        </list>
    </property>
    <property name="urlMap">
        <map>
        <!-- used to include references to my LoginController -->
            <entry key="error" value-ref="error" />
        </map>
    </property>
    <property name="order">
        <value>1</value>
    </property>
</bean>

我更改了LoginController以进行注释。其他一些类也先前已被注释,因此它将使用现有的...

<bean id="requestMappingHandlerMapping"
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="licenseInterceptor" />
            <ref bean="loginInterceptor" />
            <ref bean="propertyInterceptor" />
        </list>
    </property>
</bean>

LoginController无法使用其他人使用的loginInterceptor,因为它是登录前Controller,但是登录后Interceptor

我想知道的是,有没有办法告诉Spring这个特定的Controller不应该与特定的(loginInterceptorInterceptor一起使用?也许如果它(并且只有它)也可以使用localeChangeInterceptor

我尝试了什么

  • (适用于Spring 3.2)将<mvc:interceptors>及其命名空间添加到配置中,但它们似乎不允许多个bean引用,而exclude-mapping是Spring 3.2,我是3.1.1
  • LoginInterceptor中进行处理,处理程序不属于LoginController类型 - 我可以执行((HandlerMethod)handler).getBean() instanceof LoginController但这样做有效,但它不够漂亮或不灵活。

3 个答案:

答案 0 :(得分:2)

使用spring mvc命名空间,您可以执行以下操作:

<mvc:interceptors>
  <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <mvc:exclude-mapping path="/login"/>
    <ref bean="loginInterceptor"/>
  </mvc:interceptor>
  <!-- .. further interceptors -->
</mvc:interceptors>

这允许添加不应被特定拦截器截获的路径。

mvc命名空间添加到配置根元素..

xmlns:mvc="http://www.springframework.org/schema/mvc"

......和架构......

xsi:schemaLocation=" .....
 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
...."

答案 1 :(得分:1)

我过去通过在HandlerInterceptorAdapter中的preHandle方法中实现它来完成此操作。

@Override
public final boolean preHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler) throws Exception {
   // inspect handler object to see if it's LoginController
}

答案 2 :(得分:0)

以下是在LoginController中使用此功能所需的内容。有点像@blank的解决方案,但有一些其他的缺点,我仍然希望有一个弹簧(注释或配置)方法来解决这个问题

public final boolean preHandle(HttpServletRequest request)
{
    if (handler instanceof HandlerMethod &&
      ((HandlerMethod)handler).getBean() instanceof LoginController)
    {
      return true;
    }
    ...
}