在Spring Security中,可以使用ExceptionTranslationFilter来处理异常。ExceptionTranslationFilter是Spring Security中专门负责处理异常的过滤器,默认情况下,这个过滤器已经被自动加载到过滤器链中。
当发生认证异常时,Spring Security会将异常信息存储到HttpSession中,并将用户重定向到指定的错误页面。你可以在错误页面中获取异常信息,并根据需要进行处理。例如,展示错误消息或执行其他逻辑。
下面是一个完整的示例:
1. 在WebSecurityConfig中添加failureUrl("/login/error")。
2. 创建一个错误处理控制器,用来处理错误信息。代码如下:
@RequestMapping("/login/error")
public void loginError(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html;charset=utf-8");
AuthenticationException exception = (AuthenticationException) request.getSession().getAttribute("SPRING_SECURITY_LAST_EXCEPTION");
try {
response.getWriter().write(exception.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
上述代码中,当用户登录失败时,会被重定向到/login/error,然后在loginError方法中获取SPRING_SECURITY_LAST_EXCEPTION,并将其内容写入响应中。
如果你想在发生异常时返回 JSON 数据,而不是重定向到错误页面,可以使用以下示例代码:
if (e instanceof LockedException) {
respBean.setMsg("账户被锁定,请联系管理员!");
} else if (e instanceof CredentialsExpiredException) {
respBean.setMsg("密码过期,请联系管理员!");
} else if (e instanceof AccountExpiredException) {
respBean.setMsg("账户过期,请联系管理员!");
} else if (e instanceof DisabledException) {
respBean.setMsg("账户被禁用,请联系管理员!");
} else if (e instanceof BadCredentialsException) {
respBean.setMsg("用户名或者密码输入错误,请重新输入!");
}
out.write(new ObjectMapper().writeValueAsString(respBean));
out.flush();
out.close();
上述代码是将异常信息转化为 JSON 数据返回给客户端。