package com.yupi.springbootinit.exception; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.util.SaResult; import com.yupi.springbootinit.common.BaseResponse; import com.yupi.springbootinit.common.ErrorCode; import com.yupi.springbootinit.common.ResultUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; /** * 全局异常处理器 * * @author 程序员鱼皮 * @from 编程导航知识星球 */ @RestControllerAdvice @Slf4j public class GlobalExceptionHandler { @ExceptionHandler(BusinessException.class) public BaseResponse businessExceptionHandler(BusinessException e) { log.error("BusinessException", e); return ResultUtils.error(e.getCode(), e.getMessage()); } @ExceptionHandler(RuntimeException.class) public BaseResponse runtimeExceptionHandler(RuntimeException e) { log.error("RuntimeException", e); return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统错误"); } // 全局异常拦截(拦截项目中的NotLoginException异常) @ExceptionHandler(NotLoginException.class) public BaseResponse handlerNotLoginException(NotLoginException nle) throws Exception { // 打印堆栈,以供调试 nle.printStackTrace(); // 判断场景值,定制化异常信息 String message = ""; if(nle.getType().equals(NotLoginException.NOT_TOKEN)) { message = "未能读取到有效用户令牌"; } else if(nle.getType().equals(NotLoginException.INVALID_TOKEN)) { message = "令牌无效"; } else if(nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) { message = "令牌已过期"; } else if(nle.getType().equals(NotLoginException.BE_REPLACED)) { message = "令牌已被顶下线"; } else if(nle.getType().equals(NotLoginException.KICK_OUT)) { message = "令牌已被踢下线"; } else if(nle.getType().equals(NotLoginException.TOKEN_FREEZE)) { message = "令牌已被冻结"; } else if(nle.getType().equals(NotLoginException.NO_PREFIX)) { message = "未按照指定前缀提交令牌"; } else { message = "当前会话未登录"; } // 返回给前端 return ResultUtils.error(ErrorCode.TOKEN_INVALID.getCode(),message); } }