2013-11-27 100 views
11

我有一個MVC Java配置,但HandlerInterceptor不排除一些模式。MVC Java配置 - HandlerInterceptor不包括路徑

在生產線打上XXX,如果

1)我想補充兩個addPatterns("/**")excludePathPatterns("*.ecxld")HandlerInterceptorInterceptorRegistration,該HandlerInterceptor.preHanlde()不會被調用的。 e.g .addPathPatterns("/**").excludePathPatterns("*.ecxld")

2)I只添加excludePathPatterns("*.ecxld")HandlerInterceptorInterceptorRegistration,仍然執行HandlerInterceptor.preHanlde()

(其他攔截器調用正常)。

任何指針讚賞。

感謝

@Configuration 
public class MyMVCConfigurerAdapter extends WebMvcConfigurerAdapter { 

@Override 
public void addInterceptors(final InterceptorRegistry registry) { 

    registry.addInterceptor(getInterceptorOne()); 

    registry.addInterceptor(getMyHandlerInterceptor()) 
       .excludePathPatterns("*.ecxld"); // **xxx** 

    registry.addInterceptor(getInterceptorTwo() 
    ); 

} 

回答

0

調試完成後,攔截器不會按照它們添加的順序執行。在上面的例子中,interceptorOne,然後是interceptorTwo,然後執行處理程序(排除模式)。

9

您指定包括和排除的模式是螞蟻基地path expressions和不正常的URL表達式,你會表現在web.xml中映射例如一個servlet或過濾器。

要做一個排除工作,你還必須包括一個包含路徑(正如你已經注意到你的第二個評論)。接下來將您的排除模式更改爲/**/*.ecxld

您當前的表述*.ecxld會匹配file.ecxld,但它不會匹配/file.ecxld甚至/foo/file.ecxld/**/部分負責照顧。但爲了使其工作,它還需要includePathExpression(代碼爲checks,如果存在includePathExpression而不是忽略excludePathExpression)。

因此總之,將您的配置更改爲以下應解決您的問題。

@Configuration 
public class MyMVCConfigurerAdapter extends WebMvcConfigurerAdapter { 

@Override 
public void addInterceptors(final InterceptorRegistry registry) { 

    registry.addInterceptor(getInterceptorOne()); 

    registry.addInterceptor(getMyHandlerInterceptor()) 
       .includePathPatterns("/**") 
       .excludePathPatterns("/**/*.ecxld"); 

    registry.addInterceptor(getInterceptorTwo() 
    ); 

} 
+1

感謝您的評論。我試過這個。但它仍然不排除前處理器的路徑。 ps添加模式的方法是'.addPathPatterns()' – solarwind

+0

奇怪的是,它在我的測試用例中起作用,如果我只是嘗試匹配。啓用DEBUG或TRACE日誌記錄,並檢查請求處理過程中發生了什麼。 –

2

我知道這是很久以前,但我只是偶然發現了同樣的問題。在我的搜索過程中,我發現了以下blog。在那裏提到,如果攔截器被配置爲bean,它們將自動添加到鏈中。 我現在使用Spring 4.1.x的所以可能有差異,但什麼解決它,我是以下幾點:

  1. (。我試圖避免將它們定義爲Spring bean的它並沒有幫助)
  2. 我配置的攔截器彈簧豆(這樣我就可以自動裝配的東西放進去see here
  3. 我改變了我的定義如下:

    registry.addInterceptor(getMyHandlerInterceptor()) .addPathPatterns(「/ * *「) .excl udePathPatterns( 「/用戶/登錄」);

通過將addPathPatterns放置在excludePathPatterns之前,攔截器的行爲突然正常工作。

0

我遇到這個麻煩,不能排除路徑。 我調試後發現是因爲Spring安全重定向到「/ login」,因爲「/ login」被包含在「/ **」中,那爲什麼不能訪問。

解決方案是添加登錄&註銷鏈接作爲排除路徑!