SpringSecurity-ExceptionTranslationFilter的做用

  ExceptionTranslationFilter捕獲異常並作相應的處理。處理邏輯以下:session

  1.首先判斷是否是SpringSecurity產生的異常,若是是將在handleSpringSecurityException(request, response, chain, ase)處理,不然拋出ServletException/RuntimeException;url

  2.handleSpringSecurityException方法首先判斷是不是AuthenticationException異常,若是是就跳轉到登陸頁面;不然若是是AccessDeniedException,先判斷是不是匿名用戶,若是是,也將跳轉到登陸頁面,若是是已認證用戶,則交給accessDeniedHandler處理。spa

  3.跳轉到登陸界面前,HttpSessionRequestCache會保存當前請求的url,登陸認證經過後會直接跳轉到以前訪問的頁面。使用這個功能不能將<form-login>的always-use-default-target屬性設置爲TRUE,默認是FALSE的。這個邏輯在SavedRequestAwareAuthenticationSuccessHandler中處理。code

  4.捕獲異常跳轉頁面時能夠根據異常類型在url後面添加對應錯誤代碼,以便在登陸頁面給出提示信息。一個簡單的實現是繼承LoginUrlAuthenticationEntryPoint類,而後重寫orm

1 protected String determineUrlToUseForThisRequest(HttpServletRequest request,
2             HttpServletResponse response, AuthenticationException exception) {
3 
4         return getLoginFormUrl();
5     }

在實現體裏能夠給返回結果添加錯誤代碼。好比若是要在登陸頁面添加驗證碼,驗證碼填寫錯誤拋出一個異常,這裏就能夠根據異常類型添加對應的錯誤代碼,而後在登陸失敗頁面給出對應提示。blog

  5.對於登陸時產生的異常,默認的SimpleUrlAuthenticationFailureHandler已經把異常放置到了session中,以便跳轉後的頁面使用。繼承

request.getSession().setAttribute(WebAttributes.AUTHENTICATION_EXCEPTION,
                        exception);


public static final String AUTHENTICATION_EXCEPTION = "SPRING_SECURITY_LAST_EXCEPTION";
相關文章
相關標籤/搜索