2011-11-07 78 views
2

我对XML的这一部分:Spring MVC的拦截器映射问题

<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拦截器在它们应该被调用时被调用;然而,在他们看来,页面拦截器总是被调用。我只想要为页面调用页面拦截器。我如何做到这一点?

回答

6

假设您为网页使用一致的命名方案,请使用 - 例如,如果你的外部可见的网页网址与.html结束,注明:

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

这不是很REST风格有“扩展”一样,虽然 - 你可能更愿意使用方案,如:中

  • GET /user/{id} =返回用户对象为用户{ID},JSON格式
  • POST到/user/{id} =更新用户对象从JSON对象
  • GET到/user/page/{id} =返回HTML页面用户(编号)
  • 等等等等

然后你可以使用一个不错的可读性,语义映射,如:

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

将工作于任何“深度“的URL结构。

编辑: OK如此看来,使用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> 

(道歉上面的代码中的格式,降价认为 /**是:-)

012评论
+0

问题是我有像'〜/ index'和'〜/ preferences'这样的URL。如果URL是'〜/ data/**',那么这是一个AJAX请求。如果URL是'〜/ statics/**',那么这是对静态内容的请求。否则,这将是一个页面的请求,我的页面上没有扩展名。 – Nik

6

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

+0

请注意,与SPR-6570 中所述内容不同,不是 ,而是应该使用 。 – anre