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