Spring 控制器可以指定要使用的拦截器吗
我将现有的(3.1.1)web mvcSpring 控制器可以指定要使用的拦截器吗,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
控制器
(称为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
}
使用springmvc
命名空间,您可以执行以下操作:
<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;
}
...
}