2011-11-07 170 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