我们为Spring2.x和Spring3.1MVC对象提供了混合配置的Spring应用程序。mvc定义了同一组拦截器:拦截器标记和SimpleUrlHandlerMapping拦截器属性。我们的想法是每个处理程序映射只应用自己的拦截器,但我们注意到在Spring2URL上,拦截器被调用了两次。当我们从SimpleUrlHandlerMapping中删除拦截器时,拦截器仍然被应用,这意味着mvc:拦截器无论如何都是有效的。下面请看配置的片段:
mvc-config.xml
<mvc:annotation-driven />
<mvc:interceptors>
<ref bean="clientDataInterceptor" />
<ref bean="securityInterceptor" />
<ref bean="resourceCleanupInterceptor" />
</mvc:interceptors>springdispatcher.xml
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="alwaysUseFullPath" value="true"/>
<property name="mappings">
<props>
<prop key="/path/**">myController</prop>
...
</props>
</property>
<property name="interceptors">
<list>
<ref bean="clientDataInterceptor" />
<ref bean="securityInterceptor" />
<ref bean="resourceCleanupInterceptor" />
</list>
</property>
</bean>web.xml
<servlet>
<servlet-name>springdispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springdispatcher.xml, /WEB-INF/mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>请了解这种情况发生的原因,以及简单地删除Spring2.x拦截器列表是否安全。
发布于 2014-06-18 08:29:05
您有一个与某些URL匹配的处理程序映射(如您的例子中的/path/** )。另外,还可以有另一个与其他URL匹配的处理程序映射(比如BeanNameUrlHandlerMapping映射到bean名称或SimpleUrlHandlerMapping)。问题是,通过映射,您可以定义URL和处理程序之间的关联。如果未定义包含或排除模式,则<mvc:interceptors/>适用于所有URL。
我查看了源代码这里,特别是这里,如果没有定义excludePatterns,那么代码将继续并检查includePatterns。如果这些值也为null,则拦截器匹配。因此,我读到,如果我使用<mvc:interceptors/>定义了一个拦截器,并且没有给它任何模式来包含或排除,那么这个拦截器就适用于所有的URL。
https://stackoverflow.com/questions/24213951
复制相似问题