From 67bf832c4a59e47817e387d9f0dd9ce679368aaa Mon Sep 17 00:00:00 2001 From: xiongfeng <2439534736@qq.com> Date: Wed, 8 Nov 2023 16:04:50 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E7=B1=BB=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/exception/BusinessException.java | 38 ++++++++++++ .../common/exception/GenericResponse.java | 47 ++++++++++++++ .../exception/GlobalExceptionHandler.java | 61 +++++++++++++++++++ .../common/exception/LoginException.java | 40 ++++++++++++ .../common/exception/ResponseCode.java | 35 +++++++++++ .../interceptor/InterceptorConfig.java | 1 - .../interceptor/TokenInterceptor.java | 8 ++- 7 files changed, 226 insertions(+), 4 deletions(-) create mode 100644 src/main/java/cn/xf/basedemo/common/exception/BusinessException.java create mode 100644 src/main/java/cn/xf/basedemo/common/exception/GenericResponse.java create mode 100644 src/main/java/cn/xf/basedemo/common/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/cn/xf/basedemo/common/exception/LoginException.java create mode 100644 src/main/java/cn/xf/basedemo/common/exception/ResponseCode.java diff --git a/src/main/java/cn/xf/basedemo/common/exception/BusinessException.java b/src/main/java/cn/xf/basedemo/common/exception/BusinessException.java new file mode 100644 index 0000000..23be9d2 --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/exception/BusinessException.java @@ -0,0 +1,38 @@ +package cn.xf.basedemo.common.exception; + +import lombok.Getter; + +/** + * @Author: xiongfeng + * @CreateTime: 2023-11-08 13:54 + * @Description: TODO 业务统一异常处理类 + * @Version: 1.0 + */ +@Getter +public class BusinessException extends RuntimeException{ + private final ResponseCode code; + + public BusinessException() { + super(String.format("%s", ResponseCode.INTERNAL_ERROR.getMessage())); + this.code = ResponseCode.INTERNAL_ERROR; + } + + public BusinessException(Throwable e) { + super(e); + this.code = ResponseCode.INTERNAL_ERROR; + } + + public BusinessException(String msg) { + this(ResponseCode.INTERNAL_ERROR, msg); + } + + public BusinessException(ResponseCode code) { + super(String.format("%s", code.getMessage())); + this.code = code; + } + + public BusinessException(ResponseCode code, String msg) { + super(msg); + this.code = code; + } +} diff --git a/src/main/java/cn/xf/basedemo/common/exception/GenericResponse.java b/src/main/java/cn/xf/basedemo/common/exception/GenericResponse.java new file mode 100644 index 0000000..227a2c1 --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/exception/GenericResponse.java @@ -0,0 +1,47 @@ +package cn.xf.basedemo.common.exception; + +import lombok.Data; + +/** + * @Author: xiongfeng + * @CreateTime: 2023-11-08 13:47 + * @Description: TODO + * @Version: 1.0 + */ +@Data +public class GenericResponse { + private int code; + + private T data; + + private String message; + + public GenericResponse() {}; + + public GenericResponse(int code, T data) { + this.code = code; + this.data = data; + } + + public GenericResponse(int code, T data, String message) { + this(code, data); + this.message = message; + } + + public GenericResponse(ResponseCode responseCode) { + this.code = responseCode.getCode(); + this.data = null; + this.message = responseCode.getMessage(); + } + + public GenericResponse(ResponseCode responseCode, T data) { + this(responseCode); + this.data = data; + } + + public GenericResponse(ResponseCode responseCode, T data, String message) { + this(responseCode, data); + this.message = message; + } + +} diff --git a/src/main/java/cn/xf/basedemo/common/exception/GlobalExceptionHandler.java b/src/main/java/cn/xf/basedemo/common/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..6528ad7 --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/exception/GlobalExceptionHandler.java @@ -0,0 +1,61 @@ +package cn.xf.basedemo.common.exception; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @Author: xiongfeng + * @CreateTime: 2023-11-08 11:48 + * @Description: TODO 全局异常捕获类 + * @Version: 1.0 + */ +@Slf4j +@RestControllerAdvice +@Component +public class GlobalExceptionHandler extends ResponseEntityExceptionHandler{ + + /** + * 定义要捕获的异常 可以多个 @ExceptionHandler({}) * + * @param request request + * @param e exception + * @param response response + * @return 响应结果 + */ + @ExceptionHandler(BusinessException.class) + public GenericResponse customExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) { + BusinessException exception = (BusinessException) e; + + if (exception.getCode() == ResponseCode.USER_INPUT_ERROR) { + response.setStatus(HttpStatus.BAD_REQUEST.value()); + } else if (exception.getCode() == ResponseCode.FORBIDDEN) { + response.setStatus(HttpStatus.FORBIDDEN.value()); + } else { + response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); + } + + return new GenericResponse(exception.getCode(), null, exception.getMessage()); + } + + /** + * 登录异常捕获 + * @param request + * @param e + * @param response + * @return + */ + @ExceptionHandler(LoginException.class) + public GenericResponse tokenExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) { + log.error("token exception", e); + LoginException exception = (LoginException) e; + response.setStatus(HttpStatus.FORBIDDEN.value()); + return new GenericResponse(exception.getCode(),null,exception.getMessage()); + } + +} diff --git a/src/main/java/cn/xf/basedemo/common/exception/LoginException.java b/src/main/java/cn/xf/basedemo/common/exception/LoginException.java new file mode 100644 index 0000000..2cdeeec --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/exception/LoginException.java @@ -0,0 +1,40 @@ +package cn.xf.basedemo.common.exception; + +import lombok.Getter; + +/** + * @Author: xiongfeng + * @CreateTime: 2023-11-08 13:46 + * @Description: TODO 登录异常类 + * @Version: 1.0 + */ +@Getter +public class LoginException extends RuntimeException{ + + private final ResponseCode code; + + public LoginException() { + super(String.format("%s", ResponseCode.AUTHENTICATION_NEEDED.getMessage())); + this.code = ResponseCode.AUTHENTICATION_NEEDED; + } + + public LoginException(Throwable e) { + super(e); + this.code = ResponseCode.AUTHENTICATION_NEEDED; + } + + public LoginException(String msg) { + this(ResponseCode.AUTHENTICATION_NEEDED, msg); + } + + public LoginException(ResponseCode code) { + super(String.format("%s", code.getMessage())); + this.code = code; + } + + public LoginException(ResponseCode code, String msg) { + super(msg); + this.code = code; + } + +} diff --git a/src/main/java/cn/xf/basedemo/common/exception/ResponseCode.java b/src/main/java/cn/xf/basedemo/common/exception/ResponseCode.java new file mode 100644 index 0000000..66f4e75 --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/exception/ResponseCode.java @@ -0,0 +1,35 @@ +package cn.xf.basedemo.common.exception; + +import lombok.Getter; + +/** + * @Author: xiongfeng + * @CreateTime: 2023-11-08 13:41 + * @Description: TODO 异常状态码 + * @Version: 1.0 + */ +@Getter +public enum ResponseCode{ + + SUCCESS(0, "Success"), + + INTERNAL_ERROR(1, "服务器内部错误"), + + USER_INPUT_ERROR(2, "用户输入错误"), + + AUTHENTICATION_NEEDED(3, "Token过期或无效"), + + FORBIDDEN(4, "禁止访问"), + + TOO_FREQUENT_VISIT(5, "访问太频繁,请休息一会儿"); + + private final int code; + + private final String message; + + + ResponseCode(Integer code, String message) { + this.code = code; + this.message = message; + } +} diff --git a/src/main/java/cn/xf/basedemo/interceptor/InterceptorConfig.java b/src/main/java/cn/xf/basedemo/interceptor/InterceptorConfig.java index 721f8db..fb47fe5 100644 --- a/src/main/java/cn/xf/basedemo/interceptor/InterceptorConfig.java +++ b/src/main/java/cn/xf/basedemo/interceptor/InterceptorConfig.java @@ -1,6 +1,5 @@ package cn.xf.basedemo.interceptor; -import cn.xf.basedemo.interceptor.TokenInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; diff --git a/src/main/java/cn/xf/basedemo/interceptor/TokenInterceptor.java b/src/main/java/cn/xf/basedemo/interceptor/TokenInterceptor.java index 7529c62..57e1333 100644 --- a/src/main/java/cn/xf/basedemo/interceptor/TokenInterceptor.java +++ b/src/main/java/cn/xf/basedemo/interceptor/TokenInterceptor.java @@ -1,5 +1,7 @@ package cn.xf.basedemo.interceptor; +import cn.xf.basedemo.common.exception.LoginException; +import cn.xf.basedemo.common.exception.ResponseCode; import cn.xf.basedemo.common.model.LoginUser; import cn.xf.basedemo.common.utils.ApplicationContextUtils; import com.alibaba.fastjson.JSONObject; @@ -42,17 +44,17 @@ public class TokenInterceptor implements HandlerInterceptor { if(StringUtils.isEmpty(token)) token = request.getParameter("token"); if(StringUtils.isEmpty(token)){ - return false; + throw new LoginException("请先登录"); } String value = (String) redisTemplate.opsForValue().get("token:" + token); if(StringUtils.isEmpty(value)){ - return false; + throw new LoginException(); } JSONObject jsonObject = JSONObject.parseObject(value); //JSON对象转换成Java对象 LoginUser loginUserInfo = JSONObject.toJavaObject(jsonObject, LoginUser.class); if(loginUserInfo == null || loginUserInfo.getId() <= 0){ - return false; + throw new LoginException(ResponseCode.USER_INPUT_ERROR); } redisTemplate.expire(token, 86700, TimeUnit.SECONDS);