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

Spring 控制器可以指定要使用的拦截器吗,spring,java,spring-mvc,controller,Spring,Java,Spring Mvc,Controller,我将现有的(3.1.1)web mvc控制器(称为LoginController)移动到使用注释,我已经 <bean id="loginHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="interceptors"> <list> <ref b

我将现有的(3.1.1)web mvc
控制器
(称为
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
无法使用其他人使用的
loginInterceptor
,因为它是登录前
控制器
,但是登录后
拦截器

我想知道的是,有没有办法告诉Spring这个特定的
控制器
不应该与特定的(
loginInterceptor
拦截器一起使用?如果它(而且只有它)也可以使用
localechangereceptor
,那么可能会发生这种情况

我试过什么

  • (适用于Spring3.2)将
    及其名称空间添加到配置中,但它们似乎不允许多个bean引用,并且
    排除映射
    是Spring3.2,我是3.1.1
  • LoginInterceptor
    中进行处理时,处理程序的类型不是
    LoginController
    -我可以执行
    ((HandlerMethod)handler).getBean()instanceof LoginController
    ,这很有效,但它既不美观也不灵活

我过去是通过在
HandlerInterceptorAdapter
中的预处理方法实现的

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

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

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

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

以下是在
LoginController
中实现此功能所需的步骤。有点像@blank的解决方案,但有一些其他的不存在,我仍然希望有一个spring(注释或配置)方法来解决这个问题

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

我考虑过这一点,但是在Spring配置中没有办法做到吗?我没有办法找到Dok,那么这是什么
HandlerInterceptorAdapter
?因为在
LoginController
preHandle
中,处理程序类型是
类org.springframework.web.method.HandlerMethod
我可以这样做,但为什么我需要执行
((HandlerMethod)handler.getBean()实例来获取它的类型?!我尝试了这个方法,但它不喜欢“/login”作为路径的参数:
发现以元素“mapping”开头的无效内容。
我已经更新了我的答案,您需要将名称空间添加到配置xml文件中添加它们,结果仍然相同。如果我完全使用您的配置,我会在
排除映射
行中得到错误。参考您的后期更新,您缺少
mvc
命名空间=>
,您可以为每个url模式显式设置拦截器(无
排除映射
xsi:schemaLocation=" .....
 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
...."
public final boolean preHandle(HttpServletRequest request)
{
    if (handler instanceof HandlerMethod &&
      ((HandlerMethod)handler).getBean() instanceof LoginController)
    {
      return true;
    }
    ...
}