我正在嘗試爲403(拒絕訪問)和500(內部服務器錯誤)之類的錯誤編寫自定義錯誤頁面。它們將從Velocity模板呈現,並使用用戶的語言環境翻譯所有消息。身份驗證和區域設置解析在應用程序中正常工作。Spring SecurityContext在錯誤頁面返回空身份驗證
我將web.xml中的位置設置爲所需的頁面,並在webmvc-context.xml中添加了通過請求到視圖的控制器。
我碰到的問題是SecurityContextHolder.getContext()。getAuthentication()在錯誤頁面視圖中返回null。看着我看到日誌:
06.10 14:42:26 DEBUG - context.HttpSessionSecurityContextRepository(HttpSessionSecurityContextRepository.java:351) - - SecurityContext stored to HttpSession: '[email protected]e7b0b7: Authentication: ...
06.10 14:42:26 DEBUG - context.SecurityContextPersistenceFilter(SecurityContextPersistenceFilter.java:89) - - SecurityContextHolder now cleared, as request processing completed
06.10 14:42:26 DEBUG - servlet.DispatcherServlet(DispatcherServlet.java:691) - - DispatcherServlet with name 'foo' processing GET request for [/foo/app/error/403.html]
因此,無論春季或Tomcat重定向到一個錯誤頁面,並最終確定了請求武功,因此上下文被清除。而新的「請求」不經歷Spring Security過濾器,因此不會恢復上下文。
通常的方法是不行的,但似乎驗證信息是在會議的地方,也因爲AbstractTemplateView記錄以下:
Exposing session attribute 'SPRING_SECURITY_CONTEXT' with value [[email protected]fbd958: Authentication: org.springframework.security[email protected]edfbd958...
如何正確獲取,使正常和錯誤頁面將採取相同的行動?
謝謝!我接受了你的答案,因爲它給了我正確的輸入:'ExceptionTranslationFilter'是處理異常的人。它具有'accessDeniedHandler'屬性,默認情況下是'AccessDeniedHandlerImpl'的一個實例。幸運的是它有一個'errorPage'屬性,文檔指出,「作爲」向前「,'SecurityContextHolder'將保持填充狀態。」我重新連接了我的豆子,它工作了! – Infeligo 2011-06-13 07:19:00