Spring MVC拦截器映射问题

时间:2011-11-07 23:45:42

标签: java spring spring-mvc

我有这段XML:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/statics/**" />
        <bean class="com.company.website.servlet.StaticsHandlerInterceptor" />
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/data/**" />
        <bean class="com.company.website.servlet.AJAXHandlerInterceptor" />
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <bean class="com.company.website.servlet.PageHandlerInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

我有三种不同的拦截器是有原因的,虽然StaticsHandlerInterceptor只是preHandle方法返回true(对于我所有的静态内容(js,css等))。第二个是AJAX请求。第三个是实际页面。我所看到的是静态和AJAX拦截器被调用时应该被调用;但是,使用它们,总是会调用页面拦截器。我只想要为页面调用页面拦截器。我该如何做到这一点?

2 个答案:

答案 0 :(得分:6)

假设您为网页使用一致的命名方案,请使用 - 例如如果外部可见的网页网址以.html结尾,请指定:

<mvc:mapping path="/**/*.html" />

虽然拥有这样的“扩展”并不是非常RESTful - 您可能更喜欢使用以下方案:

  • GET of /user/{id} =返回用户{id}的用户对象,JSON格式
  • POST到/user/{id} =从 JSON对象
  • 更新用户对象
  • 获取/user/page/{id} =为用户{id}
  • 返回 HTML页面
  • 等等

然后你可以使用一个很好的可读语义映射,如:

<mvc:mapping path="/**/page/**" />

将适用于任何“深度”的URL结构。

编辑:好的,所以似乎使用mvc:interceptors样式的bean声明似乎无法为您提供指定排除所需的表现力模式而非包容。

从我在this blog中可以看出,使用更详细的HandlerMapping方法将允许您反转匹配逻辑 - 您可以指定匹配以获得所需内容:

<bean id="nonStaticNonDataMapper" class="org.springplugins.web.IgnoreSelectedAnnotationHandlerMapping">
<property name="order">
    <value>0</value>
</property>
<property name="urls">
    <list>
        <value>/statics/**</value>
        <value>/data/**</value>
    </list>
</property>
<property name="interceptors">
    <list>
        <bean class="com.company.website.servlet.PageHandlerInterceptor" />
    </list>
</property>

(对于上述代码段格式的道歉,Markdown认为/**是评论: - )

答案 1 :(得分:6)

mvc:拦截器现在支持排除特定的映射。目前它仅在Spring 3.2.0.M2中提供。您可以在JIRA项目(现已解决)中找到更多相关信息:https://jira.springsource.org/browse/SPR-6570