1.处理异常
在登录时,可能出现:
- 用户名错误:
BadCredentialsException
- 密码错误:
BadCredentialsException
- 账号被禁用:
DisabledException
在访问时,可能出现:
- 无此权限:
AccessDeniedException
以上异常都可以由统一处理异常的机制进行处理,则先在ServiceCode
中添加对应的业务状态码:
/**
* 未授权的访问
*/
Integer ERR_UNAUTHORIZED = 40100;
/**
* 未授权的访问:账号禁用
*/
Integer ERR_UNAUTHORIZED_DISABLED = 40101;
/**
* 禁止访问,通常是已登录,但无权限
*/
Integer ERR_FORBIDDEN = 40300;
然后,在统一处理异常的类中,添加对相关异常的处理:
@ExceptionHandler
public JsonResult<Void> handleBadCredentialsException(BadCredentialsException e) {
String message = "登录失败,用户名或密码错误!";
log.debug("处理BadCredentialsException:{}", message);
return JsonResult.fail(ServiceCode.ERR_UNAUTHORIZED, message);
}
@ExceptionHandler
public JsonResult<Void> handleDisabledException(DisabledException e) {
String message = "登录失败,此账号已禁用!";
log.debug("处理DisabledException:{}", message);
return JsonResult.fail(ServiceCode.ERR_UNAUTHORIZED_DISABLED, message);
}
@ExceptionHandler
public JsonResult<Void> handleAccessDeniedException(AccessDeniedException e) {
String message = "访问失败,当前登录的账号无此权限!";
log.debug("处理AccessDeniedException:{}", message);
return JsonResult.fail(ServiceCode.ERR_FORBIDDEN, message);
}
另外,在解析JWT的过程中,也可能出现异常,由于解析JWT是在过滤器中进行的,如果出现异常,不会被统一处理异常的机制获取得到(因为过滤器执行的时间点太早),所以,只能在过滤器中自行处理异常,例如:
// 尝试解析JWT
Claims claims = null;
try {
claims = Jwts.parser().setSignin