1
0
Selaa lähdekoodia

fix:全局异常处理+全局接口数据返回的bug修复

wangzaijun 7 kuukautta sitten
vanhempi
commit
094fdbc580

+ 7 - 2
service-base/src/main/java/com/simuwang/base/components/ShiroRsaCredentialsMatcher.java

@@ -5,6 +5,7 @@ import cn.hutool.crypto.asymmetric.RSA;
 import com.simuwang.base.config.DaqProperties;
 import org.apache.shiro.authc.AuthenticationInfo;
 import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.IncorrectCredentialsException;
 import org.apache.shiro.authc.credential.SimpleCredentialsMatcher;
 
 public class ShiroRsaCredentialsMatcher extends SimpleCredentialsMatcher {
@@ -31,7 +32,11 @@ public class ShiroRsaCredentialsMatcher extends SimpleCredentialsMatcher {
     }
 
     private String encryptPassword(String password) {
-        DaqProperties.SecurityRsa securityRsa = this.properties.getSecurityRsa();
-        return new RSA(securityRsa.getPrivateKey(), null).decryptStr(password, KeyType.PrivateKey);
+        try {
+            DaqProperties.SecurityRsa securityRsa = this.properties.getSecurityRsa();
+            return new RSA(securityRsa.getPrivateKey(), null).decryptStr(password, KeyType.PrivateKey);
+        } catch (Exception e) {
+            throw new IncorrectCredentialsException();
+        }
     }
 }

+ 2 - 0
service-base/src/main/java/com/simuwang/shiro/core/jwt/JwtFilter.java

@@ -14,6 +14,7 @@ import jakarta.servlet.http.HttpServletResponse;
 import org.apache.shiro.web.filter.AccessControlFilter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Component;
 import org.springframework.util.AntPathMatcher;
 
@@ -106,6 +107,7 @@ public class JwtFilter extends AccessControlFilter {
         HttpServletResponse httpServletResponse = (HttpServletResponse) response;
         httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
         httpServletResponse.setCharacterEncoding("utf-8");
+        httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
         httpServletResponse.getWriter().print(JSONUtil.toJsonStr(ResultVo.fail(20001, msg)));
     }
 }

+ 12 - 0
service-deploy/src/main/java/com/simuwang/deploy/components/ErrorInfoBuilder.java

@@ -4,16 +4,22 @@ import cn.hutool.core.exceptions.ExceptionUtil;
 import cn.hutool.core.util.StrUtil;
 import com.simuwang.base.common.exception.APIException;
 import com.simuwang.base.common.exception.ErrorInfo;
+import com.smppw.common.pojo.enums.status.ResultCode;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.IncorrectCredentialsException;
+import org.apache.shiro.authc.UnknownAccountException;
 import org.apache.shiro.authz.UnauthenticatedException;
 import org.apache.shiro.authz.UnauthorizedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.boot.context.properties.bind.validation.BindValidationException;
 import org.springframework.core.Ordered;
 import org.springframework.http.HttpStatus;
+import org.springframework.http.converter.HttpMessageNotReadableException;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.HandlerExceptionResolver;
@@ -67,10 +73,16 @@ public class ErrorInfoBuilder implements HandlerExceptionResolver, Ordered {
             msg = "请求资源找不到";
         } else if (error instanceof UnauthorizedException) {
             msg = "没有对应接口的权限";
+        } else if (error instanceof UnknownAccountException || error instanceof IncorrectCredentialsException) {
+            msg = ResultCode.AUTH_FAILD.getMsg();
+        } else if (error instanceof AuthenticationException) {
+            msg = "登录认证失败";
         } else if (error instanceof APIException e) {
             msg = e.getMsg();
         } else if (error instanceof UnauthenticatedException e) {
             msg = e.getMessage();
+        } else if (error instanceof HttpMessageNotReadableException || error instanceof BindValidationException) {
+            msg = "请求参数错误";
         } else {
             msg = error.getMessage();
         }

+ 5 - 14
service-deploy/src/main/java/com/simuwang/deploy/config/GlobalResponseBodyAdvice.java

@@ -13,12 +13,9 @@ import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.http.server.ServerHttpRequest;
 import org.springframework.http.server.ServerHttpResponse;
 import org.springframework.lang.NonNull;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
 import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
 
-import java.lang.reflect.AnnotatedElement;
-import java.util.Arrays;
-
 /**
  * @author wangzaijun
  * @date 2023/8/12 16:39
@@ -27,18 +24,11 @@ import java.util.Arrays;
 @RestControllerAdvice
 public class GlobalResponseBodyAdvice implements ResponseBodyAdvice<Object> {
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
-    private static final Class[] ANNOTATIONS = new Class[]{
-            RequestMapping.class,
-            PostMapping.class,
-            PostMapping.class,
-            DeleteMapping.class,
-            PutMapping.class
-    };
 
     @Override
-    public boolean supports(MethodParameter returnType, @NonNull Class<? extends HttpMessageConverter<?>> converterType) {
-        AnnotatedElement element = returnType.getAnnotatedElement();
-        return Arrays.stream(ANNOTATIONS).anyMatch((annotation) -> annotation.isAnnotation() && element.isAnnotationPresent(annotation));
+    public boolean supports(@NonNull MethodParameter returnType, @NonNull Class<? extends HttpMessageConverter<?>> converterType) {
+        // 全部接口都要拦截?
+        return true;
     }
 
     @Override
@@ -47,6 +37,7 @@ public class GlobalResponseBodyAdvice implements ResponseBodyAdvice<Object> {
                                   @NonNull ServerHttpRequest request, @NonNull ServerHttpResponse response) {
         if (body instanceof String) {
             // 当响应体是String类型时
+            response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
             return JSONUtil.toJsonStr(ResultVo.ok(body));
         }
         if (body instanceof ResultVo<?>) {

+ 7 - 14
service-manage/src/main/java/com/simuwang/manage/api/LoginController.java

@@ -9,8 +9,6 @@ import com.smppw.common.pojo.ResultVo;
 import com.smppw.common.pojo.enums.status.ResultCode;
 import jakarta.servlet.http.HttpServletResponse;
 import org.apache.shiro.SecurityUtils;
-import org.apache.shiro.authc.IncorrectCredentialsException;
-import org.apache.shiro.authc.UnknownAccountException;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.apache.shiro.subject.Subject;
@@ -36,19 +34,14 @@ public class LoginController {
 
     @PostMapping("login")
     public ResultVo<String> login(@RequestBody LoginUser loginUser, HttpServletResponse response) {
-        String token;
-        try {
-            ShiroToken shiroToken = new ShiroToken(loginUser.getUsername(), loginUser.getPassword());
-            Subject subject = SecurityUtils.getSubject();
-            subject.login(shiroToken);
+        ShiroToken shiroToken = new ShiroToken(loginUser.getUsername(), loginUser.getPassword());
+        Subject subject = SecurityUtils.getSubject();
+        subject.login(shiroToken);
 
-            token = jwtContext.generateToken(loginUser.getUsername());
-            this.jwtContext.setUserCache(token);
-            response.setHeader(JwtContext.HEADER, token);
-            response.setHeader("Access-control-Expost-Headers", JwtContext.HEADER);
-        } catch (UnknownAccountException | IncorrectCredentialsException exception) {
-            return ResultVo.fail(ResultCode.AUTH_FAILD);
-        }
+        String token = jwtContext.generateToken(loginUser.getUsername());
+        this.jwtContext.setUserCache(token);
+        response.setHeader(JwtContext.HEADER, token);
+        response.setHeader("Access-control-Expost-Headers", JwtContext.HEADER);
         return ResultVo.ok(ResultCode.SUCCESS.getCode(), "登录成功", token);
     }