package com.kidgrow.common.exception; import com.kidgrow.common.model.ErrorCode; import com.kidgrow.common.model.ResultBody; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.validation.BindingResult; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
* * @Description:
* @Project:
* @CreateDate: Created in 2020/2/4 14:13
* @Author: liuke */ @ControllerAdvice @ResponseBody @Slf4j public class GlobalExceptionHandler { /** * 统一异常处理 * AuthenticationException * * @param ex * @param request * @param response * @return */ // @ExceptionHandler({AuthenticationException.class}) // public static ResultBody authenticationException(Exception ex, HttpServletRequest request, HttpServletResponse response) { // ResultBody resultBody = resolveException(ex, request.getRequestURI()); // response.setStatus(resultBody.getHttpStatus()); // return resultBody; // } /** * OAuth2Exception * * @param ex * @param request * @param response * @return */ // @ExceptionHandler({OAuth2Exception.class, InvalidTokenException.class}) // public static ResultBody oauth2Exception(Exception ex, HttpServletRequest request, HttpServletResponse response) { // ResultBody resultBody = resolveException(ex, request.getRequestURI()); // response.setStatus(resultBody.getHttpStatus()); // return resultBody; // } /** * 自定义异常 * * @param ex * @param request * @param response * @return */ @ExceptionHandler({KidgrowException.class}) public static ResultBody openException(Exception ex, HttpServletRequest request, HttpServletResponse response) { ResultBody resultBody = resolveException(ex, request.getRequestURI()); response.setStatus(resultBody.getHttpStatus()); return resultBody; } /** * 其他异常 * * @param ex * @param request * @param response * @return */ @ExceptionHandler({Exception.class}) public static ResultBody exception(Exception ex, HttpServletRequest request, HttpServletResponse response) { ResultBody resultBody = resolveException(ex, request.getRequestURI()); response.setStatus(resultBody.getHttpStatus()); return resultBody; } /** * 静态解析异常。可以直接调用 * * @param ex * @return */ public static ResultBody resolveException(Exception ex, String path) { ErrorCode code = ErrorCode.ERROR; int httpStatus = HttpStatus.INTERNAL_SERVER_ERROR.value(); String message = ex.getMessage(); String superClassName = ex.getClass().getSuperclass().getName(); String className = ex.getClass().getName(); if (className.contains("UsernameNotFoundException")) { httpStatus = HttpStatus.UNAUTHORIZED.value(); code = ErrorCode.USERNAME_NOT_FOUND; } else if (className.contains("BadCredentialsException")) { httpStatus = HttpStatus.UNAUTHORIZED.value(); code = ErrorCode.BAD_CREDENTIALS; } else if (className.contains("AccountExpiredException")) { httpStatus = HttpStatus.UNAUTHORIZED.value(); code = ErrorCode.ACCOUNT_EXPIRED; } else if (className.contains("LockedException")) { httpStatus = HttpStatus.UNAUTHORIZED.value(); code = ErrorCode.ACCOUNT_LOCKED; } else if (className.contains("DisabledException")) { httpStatus = HttpStatus.UNAUTHORIZED.value(); code = ErrorCode.ACCOUNT_DISABLED; } else if (className.contains("CredentialsExpiredException")) { httpStatus = HttpStatus.UNAUTHORIZED.value(); code = ErrorCode.CREDENTIALS_EXPIRED; } else if (className.contains("InvalidClientException")) { httpStatus = HttpStatus.UNAUTHORIZED.value(); code = ErrorCode.INVALID_CLIENT; } else if (className.contains("UnauthorizedClientException")) { httpStatus = HttpStatus.UNAUTHORIZED.value(); code = ErrorCode.UNAUTHORIZED_CLIENT; }else if (className.contains("InsufficientAuthenticationException") || className.contains("AuthenticationCredentialsNotFoundException")) { httpStatus = HttpStatus.UNAUTHORIZED.value(); code = ErrorCode.UNAUTHORIZED; } else if (className.contains("InvalidGrantException")) { code = ErrorCode.ALERT; if ("Bad credentials".contains(message)) { code = ErrorCode.BAD_CREDENTIALS; } else if ("User is disabled".contains(message)) { code = ErrorCode.ACCOUNT_DISABLED; } else if ("User account is locked".contains(message)) { code = ErrorCode.ACCOUNT_LOCKED; } } else if (className.contains("InvalidScopeException")) { httpStatus = HttpStatus.UNAUTHORIZED.value(); code = ErrorCode.INVALID_SCOPE; } else if (className.contains("InvalidTokenException")) { httpStatus = HttpStatus.UNAUTHORIZED.value(); code = ErrorCode.INVALID_TOKEN; } else if (className.contains("InvalidRequestException")) { httpStatus = HttpStatus.BAD_REQUEST.value(); code = ErrorCode.INVALID_REQUEST; } else if (className.contains("RedirectMismatchException")) { code = ErrorCode.REDIRECT_URI_MISMATCH; } else if (className.contains("UnsupportedGrantTypeException")) { code = ErrorCode.UNSUPPORTED_GRANT_TYPE; } else if (className.contains("UnsupportedResponseTypeException")) { code = ErrorCode.UNSUPPORTED_RESPONSE_TYPE; } else if (className.contains("UserDeniedAuthorizationException")) { code = ErrorCode.ACCESS_DENIED; } else if (className.contains("AccessDeniedException")) { code = ErrorCode.ACCESS_DENIED; httpStatus = HttpStatus.FORBIDDEN.value(); if (ErrorCode.ACCESS_DENIED_BLACK_LIMITED.getMessage().contains(message)) { code = ErrorCode.ACCESS_DENIED_BLACK_LIMITED; } else if (ErrorCode.ACCESS_DENIED_WHITE_LIMITED.getMessage().contains(message)) { code = ErrorCode.ACCESS_DENIED_WHITE_LIMITED; } else if (ErrorCode.ACCESS_DENIED_AUTHORITY_EXPIRED.getMessage().contains(message)) { code = ErrorCode.ACCESS_DENIED_AUTHORITY_EXPIRED; }else if (ErrorCode.ACCESS_DENIED_UPDATING.getMessage().contains(message)) { code = ErrorCode.ACCESS_DENIED_UPDATING; }else if (ErrorCode.ACCESS_DENIED_DISABLED.getMessage().contains(message)) { code = ErrorCode.ACCESS_DENIED_DISABLED; } else if (ErrorCode.ACCESS_DENIED_NOT_OPEN.getMessage().contains(message)) { code = ErrorCode.ACCESS_DENIED_NOT_OPEN; } } else if (className.contains("HttpMessageNotReadableException") || className.contains("TypeMismatchException") || className.contains("MissingServletRequestParameterException")) { httpStatus = HttpStatus.BAD_REQUEST.value(); code = ErrorCode.BAD_REQUEST; } else if (className.contains("NoHandlerFoundException")) { httpStatus = HttpStatus.NOT_FOUND.value(); code = ErrorCode.NOT_FOUND; } else if (className.contains("HttpRequestMethodNotSupportedException")) { httpStatus = HttpStatus.METHOD_NOT_ALLOWED.value(); code = ErrorCode.METHOD_NOT_ALLOWED; } else if (className.contains("HttpMediaTypeNotAcceptableException")) { httpStatus = HttpStatus.BAD_REQUEST.value(); code = ErrorCode.MEDIA_TYPE_NOT_ACCEPTABLE; } else if (className.contains("MethodArgumentNotValidException")) { BindingResult bindingResult = ((MethodArgumentNotValidException) ex).getBindingResult(); code = ErrorCode.ALERT; return ResultBody.failed().code(code.getCode()).msg(bindingResult.getFieldError().getDefaultMessage()); } else if (className.contains("IllegalArgumentException")) { //参数错误 code = ErrorCode.ALERT; httpStatus = HttpStatus.BAD_REQUEST.value(); } else if (className.contains("OpenAlertException")) { code = ErrorCode.ALERT; } else if (className.contains("OpenSignatureException")) { httpStatus = HttpStatus.BAD_REQUEST.value(); code = ErrorCode.SIGNATURE_DENIED; }else if(message.equalsIgnoreCase(ErrorCode.TOO_MANY_REQUESTS.name())){ code = ErrorCode.TOO_MANY_REQUESTS; } return buildBody(ex, code, path, httpStatus); } /** * 构建返回结果对象 * * @param exception * @return */ private static ResultBody buildBody(Exception exception, ErrorCode resultCode, String path, int httpStatus) { if (resultCode == null) { resultCode = ErrorCode.ERROR; } ResultBody resultBody = ResultBody.failed().code(resultCode.getCode()).msg(exception.getMessage()).path(path).httpStatus(httpStatus); log.error("==> error:{} exception: {}",resultBody, exception); return resultBody; } }