hr~ 16 ساعت پیش
والد
کامیت
36e68e50ca

+ 6 - 2
user-common/src/main/java/com/poyee/aspect/weblog/WebLogAspect.java

@@ -38,7 +38,10 @@ public class WebLogAspect {
     @Before("webLog()")
     public void doBefore(JoinPoint joinPoint) {
         HttpServletRequest request = ServletUtils.getRequest();
-        String traceId = Objects.requireNonNull(request).getHeader("X-Trace-Id");
+        if (request == null) {
+            return;
+        }
+        String traceId = request.getHeader("X-Trace-Id");
         if (!StringUtils.hasText(traceId)) {
             traceId = UUID.randomUUID().toString().replace("-", "");
         }
@@ -75,7 +78,8 @@ public class WebLogAspect {
     public void throwing(Throwable e) {
         HttpServletRequest request = ServletUtils.getRequest();
         long costTime = System.currentTimeMillis() - RequestNoContext.callTime.get();
-        logger.error("\n--------------[{}]返回内容开始----------------\n    接口地址:{}\n    请求令牌:{}\n    接口参数:{}\n    请求失败:{}\n    请求耗时:{}ms\n--------------[{}]返回内容结束----------------", RequestNoContext.currentThreadId.get(), RequestNoContext.apiUrl.get(), Objects.requireNonNull(request).getHeader("Authorization"), RequestNoContext.requestParam.get(), e.getMessage(), costTime, RequestNoContext.currentThreadId.get());
+        String authorization = request != null ? request.getHeader("Authorization") : "";
+        logger.error("\n--------------[{}]返回内容开始----------------\n    接口地址:{}\n    请求令牌:{}\n    接口参数:{}\n    请求失败:{}\n    请求耗时:{}ms\n--------------[{}]返回内容结束----------------", RequestNoContext.currentThreadId.get(), RequestNoContext.apiUrl.get(), authorization, RequestNoContext.requestParam.get(), e.getMessage(), costTime, RequestNoContext.currentThreadId.get());
         RequestNoContext.remove();
         MDC.remove("traceId");
     }

+ 60 - 18
user-common/src/main/java/com/poyee/exception/GlobalExceptionHandler.java

@@ -33,17 +33,27 @@ public class GlobalExceptionHandler {
      */
     @ExceptionHandler(BusinessException.class)
     public Result<Void> handleBusinessException(BusinessException e) {
-        log.warn("业务异常:{}", I18nUtil.getMessage(e.getMessage()));
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-        return Result.error(e.getCode(), I18nUtil.getMessage(e.getMessage()));
+        String message = e.getMessage();
+        String i18nMessage = I18nUtil.getMessage(message);
+        log.warn("业务异常:{}", i18nMessage != null ? i18nMessage : message);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        }
+        return Result.error(e.getCode(), i18nMessage != null ? i18nMessage : message);
     }
 
 
     @ExceptionHandler(RuntimeException.class)
     public Result<Void> handleRuntimeException(RuntimeException e) {
-        log.warn("运行异常:{}", I18nUtil.getMessage(e.getMessage()));
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-        return Result.error(I18nUtil.getMessage(e.getMessage()));
+        String message = e.getMessage();
+        String i18nMessage = message != null ? I18nUtil.getMessage(message) : null;
+        log.warn("运行异常:{}", i18nMessage != null ? i18nMessage : message);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        }
+        return Result.error(i18nMessage != null ? i18nMessage : (message != null ? message : "系统运行异常"));
     }
 
     /**
@@ -52,7 +62,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(Exception.class)
     public Result<Void> handleException(Exception e) {
         log.error("系统异常", e);
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        }
         return Result.error(500, "系统繁忙,请稍后重试");
     }
 
@@ -63,7 +76,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(IllegalArgumentException.class)
     public Result<Void> handleIllegalArgumentException(IllegalArgumentException e) {
         log.error("参数异常", e);
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        }
         return Result.error(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
     }
 
@@ -81,7 +97,10 @@ public class GlobalExceptionHandler {
                     return i18nMessage != null ? i18nMessage : defaultMessage;
                 })
                 .collect(Collectors.toList());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        }
         return Result.error(HttpServletResponse.SC_BAD_REQUEST, collect.toString());
     }
 
@@ -91,7 +110,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(MissingServletRequestParameterException.class)
     public Result<Void> handleMissingServletRequestParameter(MissingServletRequestParameterException e) {
         log.warn("缺少请求参数:{}", e.getParameterName());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        }
         return Result.error(HttpServletResponse.SC_BAD_REQUEST, "缺少请求参数:" + e.getParameterName());
     }
 
@@ -101,7 +123,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(MethodArgumentTypeMismatchException.class)
     public Result<Void> handleMethodArgumentTypeMismatch(MethodArgumentTypeMismatchException e) {
         log.warn("参数类型不匹配:{}", e.getName());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        }
         return Result.error(HttpServletResponse.SC_BAD_REQUEST, "参数类型不匹配:" + e.getName());
     }
 
@@ -111,7 +136,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(HttpMessageNotReadableException.class)
     public Result<Void> handleHttpMessageNotReadable(HttpMessageNotReadableException e) {
         log.warn("请求体解析失败:{}", e.getMessage());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        }
         return Result.error(HttpServletResponse.SC_BAD_REQUEST, "请求体格式错误");
     }
 
@@ -121,7 +149,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
     public Result<Void> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e) {
         log.warn("请求方法不支持:{}", e.getMethod());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+        }
         return Result.error(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "不支持的请求方法:" + e.getMethod());
     }
 
@@ -131,7 +162,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
     public Result<Void> handleHttpMediaTypeNotSupported(HttpMediaTypeNotSupportedException e) {
         log.warn("媒体类型不支持:{}", e.getContentType());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+        }
         return Result.error(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "不支持的媒体类型:" + e.getContentType());
     }
 
@@ -141,18 +175,23 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(TokenExpiredException.class)
     public Result<Void> handleTokenExpired(TokenExpiredException e) {
         log.warn("Token已过期:{}", e.getMessage());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        }
         return Result.error(HttpServletResponse.SC_UNAUTHORIZED, "Token已过期,请重新登录");
     }
 
-
     /**
      * JWT Token 验证失败
      */
     @ExceptionHandler(JWTVerificationException.class)
     public Result<Void> handleJWTVerification(JWTVerificationException e) {
         log.warn("Token验证失败:{}", e.getMessage());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        }
         return Result.error(HttpServletResponse.SC_UNAUTHORIZED, "Token无效,请重新登录");
     }
 
@@ -162,7 +201,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(NullPointerException.class)
     public Result<Void> handleNullPointerException(NullPointerException e) {
         log.error("空指针异常", e);
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        }
         return Result.error(500, "系统繁忙,请稍后重试");
     }
 }

+ 8 - 3
user-common/src/main/java/com/poyee/utils/JwtUtils.java

@@ -18,8 +18,13 @@ public class JwtUtils {
      * 2. Base64编码的用户信息
      */
     public static JSONObject getTokenUserInfo(String token) {
-        JWT jwt = JWTUtil.parseToken(token);
-        String payloads = jwt.getPayloads().toString();
-        return JSONObject.parseObject(payloads);
+        try {
+            JWT jwt = JWTUtil.parseToken(token);
+            String payloads = jwt.getPayloads().toString();
+            return JSONObject.parseObject(payloads);
+        } catch (Exception e) {
+            log.error("解析JWT Token失败", e);
+            return null;
+        }
     }
 }

+ 5 - 1
user-common/src/main/java/com/poyee/utils/ServletUtils.java

@@ -26,7 +26,11 @@ public class ServletUtils {
     }
 
     public static HttpServletResponse getHttpResponse() {
-        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (attributes == null) {
+            return null;
+        }
+        return attributes.getResponse();
     }
 
     /**