2025-06-11 14:45:40 +08:00
|
|
|
|
package com.yupi.springbootinit.exception;
|
|
|
|
|
|
|
2025-06-12 20:25:15 +08:00
|
|
|
|
import cn.dev33.satoken.exception.NotLoginException;
|
|
|
|
|
|
import cn.dev33.satoken.util.SaResult;
|
2025-06-11 14:45:40 +08:00
|
|
|
|
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 <a href="https://github.com/liyupi">程序员鱼皮</a>
|
|
|
|
|
|
* @from <a href="https://yupi.icu">编程导航知识星球</a>
|
|
|
|
|
|
*/
|
|
|
|
|
|
@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, "系统错误");
|
|
|
|
|
|
}
|
2025-06-12 20:25:15 +08:00
|
|
|
|
|
|
|
|
|
|
// 全局异常拦截(拦截项目中的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 = "当前会话未登录";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回给前端
|
2025-06-25 14:20:32 +08:00
|
|
|
|
return ResultUtils.error(ErrorCode.TOKEN_INVALID.getCode(),message);
|
2025-06-12 20:25:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-11 14:45:40 +08:00
|
|
|
|
}
|