我正在将现有的spring(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
不应该与特定的(loginInterceptor
)Interceptor
一起使用?也许如果它(并且只有它)也可以使用localeChangeInterceptor
。
我尝试了什么
<mvc:interceptors>
及其命名空间添加到配置中,但它们似乎不允许多个bean引用,而exclude-mapping
是Spring 3.2,我是3.1.1 LoginInterceptor
中进行处理,处理程序不属于LoginController
类型 - 我可以执行((HandlerMethod)handler).getBean() instanceof LoginController
但这样做有效,但它不够漂亮或不灵活。答案 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;
}
...
}