2012-05-18 65 views
0

在我的spring-3應用程序中,我有一個AuthenticationInterceptor(它基本上是一個攔截器),它檢查用戶的權限。我正在使用Spring的MultipartResolver來嘗試將文件上傳到服務器。 我現在面臨的問題是我希望根據用戶權限執行不同的操作,如果是MaxUploadSizeExceededException。 但是我發現這個異常發生在DispatcherServlet級別,並且被HandlerExceptionResolver 抓到了我希望能夠在發生這種情況之前調用我的AuthenticationInterceptor? 有沒有簡單的方法。無法在Spring中的MultipartResolver之前調用攔截器

回答

1

問題是,在將請求分派給控制器之前發生異常,因此您的攔截器也不會觸發。我想你已經找到了這個部分。

想要得到周圍...

對於初學者來說,我會用Servlet過濾出移動認證機制在Servlet的前面。這就是說,當像Spring Security這樣的優秀產品可以爲你做時,在這個空間裏推出你自己的解決方案是沒有意義的。

一旦你轉換到Spring Security(或類似的),用戶的SecurityContext(角色,權限等)將在異常發生時被解決並被捕獲。

現在,如果我正確地閱讀您的問題,看起來您可能希望根據用戶的角色,權限等以不同的方式響應該異常。這應該是可能的。您將實現一個自定義的HandlerExceptionResolver,它檢查SecurityContext以查看用戶是否具有某個角色或權限,然後進行相應響應。

希望有幫助!

+0

但我已經有了認證機制,我現在不想改變它。另外我很好奇這些組件被調用的順序。當你說 **異常發生之前,請求被分派到控制器,因此,你的攔截器也永遠不會發射** 我很好奇,爲什麼是這樣的情況。 –

+0

有一種稱爲「過濾模式」的通用模式,涉及預處理請求。 Servlet過濾器是該模式的一個實現。 Spring MVC的攔截器是另一種相同模式的實現。區別在於他們攔截/預處理請求。一個servlet過濾器會在請求發生之前預先處理請求(在這種情況下,Spring MVC的DispatcherServlet)。但是,攔截器在DispatcherServlet將請求分派給其中一個控制器之前對請求執行預處理。 –

+0

爲了滿足您的需求,您需要的是在請求遇到DispatcherServlet之前攔截/預處理請求。這意味着使用一個servlet過濾器,正如我所指出的那樣,已經有一個非常棒的安全實現可用,它基於Spring Security。如果你想繼續使用你的AuthInterceptor,那麼你會獲得更多的權力,但是你希望通過這種方法實現的目標是無法實現的。總的來說,我認爲在使用已經經過驗證的解決方案之前,您最好使用一百萬個已經通過測試的解決方案,而不是自行開發。 –

0

有兩種基本的方法來處理的處理程序代碼做之前插播一些被稱爲:

  1. 落實HandlerInterceptor界面和代碼要在preHandle方法運行代碼
  2. 創建使用@Aspect和配置切入點的看點運行@Before方法調用

在這兩種情況下,你可以檢查登錄使用用戶的角色3210,然後根據角色成員身份決定要執行的操作。

+0

這個解決方案的基礎也是我相信我使用Spring的SrpingSecurity模塊? –

+0

否 - 不管您是否使用Spring Security,HandlerInterceptor都可用 – atrain