在我的spring-3應用程序中,我有一個AuthenticationInterceptor(它基本上是一個攔截器),它檢查用戶的權限。我正在使用Spring的MultipartResolver
來嘗試將文件上傳到服務器。 我現在面臨的問題是我希望根據用戶權限執行不同的操作,如果是MaxUploadSizeExceededException
。 但是我發現這個異常發生在DispatcherServlet級別,並且被HandlerExceptionResolver
抓到了我希望能夠在發生這種情況之前調用我的AuthenticationInterceptor? 有沒有簡單的方法。無法在Spring中的MultipartResolver之前調用攔截器
回答
問題是,在將請求分派給控制器之前發生異常,因此您的攔截器也不會觸發。我想你已經找到了這個部分。
想要得到周圍...
對於初學者來說,我會用Servlet過濾出移動認證機制在Servlet的前面。這就是說,當像Spring Security這樣的優秀產品可以爲你做時,在這個空間裏推出你自己的解決方案是沒有意義的。
一旦你轉換到Spring Security(或類似的),用戶的SecurityContext(角色,權限等)將在異常發生時被解決並被捕獲。
現在,如果我正確地閱讀您的問題,看起來您可能希望根據用戶的角色,權限等以不同的方式響應該異常。這應該是可能的。您將實現一個自定義的HandlerExceptionResolver,它檢查SecurityContext以查看用戶是否具有某個角色或權限,然後進行相應響應。
希望有幫助!
有兩種基本的方法來處理的處理程序代碼做之前插播一些被稱爲:
- 落實
HandlerInterceptor
界面和代碼要在preHandle
方法運行代碼 - 創建使用
@Aspect
和配置切入點的看點運行@Before
方法調用
在這兩種情況下,你可以檢查登錄使用用戶的角色3210,然後根據角色成員身份決定要執行的操作。
這個解決方案的基礎也是我相信我使用Spring的SrpingSecurity模塊? –
否 - 不管您是否使用Spring Security,HandlerInterceptor都可用 – atrain
- 1. 在攔截器之前調用的Spring Web MVC 3.1.1參數解析器
- 2. 如何在Spring Web Flow的每個Dispatcher servlet之前調用攔截器?
- 3. Spring中的攔截器2.5
- 4. Spring攔截器未被調用
- 5. 攔截之前:在請求
- 6. 在RestKit之前攔截JSON
- 7. Spring Cache攔截器
- 8. Spring RestEasy攔截器
- 9. 不使用攔截器綁定調用攔截器方法
- 10. Spring 3 HandlerInterceptorAdapter。請求結束404前調用攔截器
- 11. 的Java Spring MVC的前/使用攔截
- 12. BasicDataSource的Spring攔截器
- 13. Spring攔截器/過濾器
- 14. Android之前攔截Intent(NFC)
- 15. 攔截Spring MVC中
- 16. Spring MVC 3.2 @ResponseBody攔截器
- 17. Spring方法攔截 - 性能
- 18. Spring JMX攔截
- 19. 無法使用multipartResolver
- 20. 如何在調用之前/之後使用ContextBoundObject攔截函數調用?
- 21. 在方法之前測試Grails 3攔截器
- 22. 如何使用Spring攔截或過濾器攔截資源
- 23. 攔截器方法未被調用
- 24. 攔截器與Spring中的方面?
- 25. 覆蓋攔截器的ModelAndView在Spring MVC
- 26. .NET方法調用攔截
- 27. Python攔截方法調用
- 28. @Autowired無法使用攔截器
- 29. servicemix中所有調用的攔截器
- 30. Apache CXF攔截器:無法修改Out Out攔截器中的響應流
但我已經有了認證機制,我現在不想改變它。另外我很好奇這些組件被調用的順序。當你說 **異常發生之前,請求被分派到控制器,因此,你的攔截器也永遠不會發射** 我很好奇,爲什麼是這樣的情況。 –
有一種稱爲「過濾模式」的通用模式,涉及預處理請求。 Servlet過濾器是該模式的一個實現。 Spring MVC的攔截器是另一種相同模式的實現。區別在於他們攔截/預處理請求。一個servlet過濾器會在請求發生之前預先處理請求(在這種情況下,Spring MVC的DispatcherServlet)。但是,攔截器在DispatcherServlet將請求分派給其中一個控制器之前對請求執行預處理。 –
爲了滿足您的需求,您需要的是在請求遇到DispatcherServlet之前攔截/預處理請求。這意味着使用一個servlet過濾器,正如我所指出的那樣,已經有一個非常棒的安全實現可用,它基於Spring Security。如果你想繼續使用你的AuthInterceptor,那麼你會獲得更多的權力,但是你希望通過這種方法實現的目標是無法實現的。總的來說,我認爲在使用已經經過驗證的解決方案之前,您最好使用一百萬個已經通過測試的解決方案,而不是自行開發。 –