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";