首先在做拦截器的时候发现,出现异常或者token格式不正确的时候,后台抛出异常处理,前台页面不显示错误信息,导致前台不知道后台发生了什么,全局异常就是自定义异常处理,出现问题进行抛出,返回给前端具体异常信息。
1.0 声明自定义异常
首先列出异常信息枚举类的代码,之后出现新的异常可以进一步添加枚举。
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
@Getter
@ToString
@AllArgsConstructor
public enum RespBeanEnum {
//通用返回
SUCCESS(200,"success"),
ERROR(500,"服务端异常"),
//登录模块
LOGIN_ERROR(500210,"用户名密码不正确"),
TOKEN_ERROR_TOKEN(500211,"用户未登录"),
TOKEN_ERROR(500221,"token格式不正确");
private final Integer code;
private final String message;
}
统一异常返回类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RespBean {
private long code;
private String message;
private Object obj;
/**
* 功能描述: 成功返回结果
*
* @param:
* @return:
*
*/
public static RespBean success(){
return new RespBean(RespBeanEnum.SUCCESS.getCode(),RespBeanEnum.SUCCESS.getMessage(),null);
}
/**
* 功能描述: 成功返回结果
*/
public static RespBean success(Object obj){
return new RespBean(RespBeanEnum.SUCCESS.getCode(),RespBean.success().getMessage(),obj);
}
/**
* 功能描述: 失败返回结果
*/
public static RespBean error(RespBeanEnum respBeanEnum){
return new RespBean(respBeanEnum.getCode(),respBeanEnum.getMessage(),null);
}
/**
* 功能描述: 失败返回结果
*/
public static RespBean error(RespBeanEnum respBeanEnum,Object obj){
return new RespBean(respBeanEnum.getCode(),respBeanEnum.getMessage(),obj);
}
}
之后声明自定义异常,要继承RuntimeException
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GlobalException extends RuntimeException {
private RespBeanEnum respBeanEnum;
}
定义了自定义异常后,需要对异常进行处理,所以再添加异常处理类。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public RespBean ExceptionHandler(Exception e){
if(e instanceof GlobalException){
GlobalException ex = (GlobalException) e;
return RespBean.error(ex.getRespBeanEnum());
}
System.out.println("异常是--->" + e);
return RespBean.error(RespBeanEnum.ERROR);
}
}
之后拦截器中的代码有问题,可以直接抛出具体自定义异常枚举。
@AllArgsConstructor
public class UserLoginInterceptor implements HandlerInterceptor {
private RedisCache redisCache;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取token
String token = request.getHeader("token");
if (!StringUtils.hasText(token)) {
//token等于空,直接抛出用户未登录异常
throw new GlobalException(RespBeanEnum.TOKEN_ERROR_TOKEN);
}
String userId;
try {
Claims claims = JwtUtil.parseJWT(token);
userId = claims.getSubject();
}catch (Exception e){
e.printStackTrace();
throw new GlobalException(RespBeanEnum.TOKEN_ERROR);
}
//从redis中获取用户信息
String redisKey = "login" + userId;
User loginUser = redisCache.getCacheObject(redisKey);
if(Objects.isNull(loginUser)){
throw new GlobalException(RespBeanEnum.TOKEN_ERROR_TOKEN);
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
下一期准备写写日志,对日志工具进行学习一下,实现一下日志,之前没写过日志,之前实习的公司要求写写日志,好对错信息进行定位。