2015-10-22 41 views
4

通常,當頁面一直保留到會話過期並且我嘗試提交POST操作時,Spring Security生成的CSRF令牌將不會與服務器的期望值匹配。在這種情況下,錯誤是預期的結果。在Spring Security中定製CSRF錯誤頁面

但是,我總是得到默認的Tomcat 403錯誤,這是非常醜陋的。它是由安全過濾器拋出的403錯誤引起的。

但是,我想攔截特定的CSRF錯誤以執行自定義操作。也就是說,以下將無法工作,因爲錯誤被拋出早得多比MVC管道

@ExceptionHandler(CsrfException.class) 
public String exception(CsrfException ex) 
{ 
    log.error(ex.getMessage(), ex); 

    return "redirect:/index.jsp"; 
} 

重定向到一個索引頁(或其他)似乎是一個不錯的解決方案。我如何攔截錯誤的CSRF令牌錯誤並自定義服務器響應?

+0

500的通常意味着未捕獲的異常。你能找到一個堆棧跟蹤嗎? – holmis83

+0

對不起,我的意思是403。我將在當前的答案 –

回答

3

用於檢查CSRF Spring Security使用CsrfFilter。在丟失或無效令牌的情況下,它使用AccessDeniedHandler

if (missingToken) { 
       accessDeniedHandler.handle(request, response, 
         new MissingCsrfTokenException(actualToken)); 
      } 
      else { 
       accessDeniedHandler.handle(request, response, 
         new InvalidCsrfTokenException(csrfToken, actualToken)); 
      } 

所以處理這種錯誤的一種方式可能是自己實現這個處理器

@Override 
    public void configure(HttpSecurity http) throws Exception { 
    HttpSecurity http = http.exceptionHandling().accessDeniedHandler(myAccessDeniedHandler); 
} 
+0

上工作我會用XML(需要找到設置它的位置)來做這件事,謝謝這導致了正確的路徑 –

相關問題