ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java
@@ -31,10 +31,11 @@ * 成功标记 */ public static final Integer SUCCESS = 200; /** * 失败标记 */ public static final Integer FAIL = 501; public static final Integer FAIL = 500; /** * 登录成功 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/R.java
@@ -12,6 +12,12 @@ { private static final long serialVersionUID = 1L; /** 成功 */ public static final int SUCCESS = Constants.SUCCESS; /** 失败 */ public static final int FAIL = Constants.FAIL; private int code; private String msg; @@ -20,40 +26,40 @@ public static <T> R<T> ok() { return restResult(null, Constants.SUCCESS, null); return restResult(null, SUCCESS, null); } public static <T> R<T> ok(T data) { return restResult(data, Constants.SUCCESS, null); return restResult(data, SUCCESS, null); } public static <T> R<T> ok(T data, String msg) { return restResult(data, Constants.SUCCESS, msg); return restResult(data, SUCCESS, msg); } public static <T> R<T> failed() public static <T> R<T> fail() { return restResult(null, Constants.FAIL, null); return restResult(null, FAIL, null); } public static <T> R<T> failed(String msg) public static <T> R<T> fail(String msg) { return restResult(null, Constants.FAIL, msg); return restResult(null, FAIL, msg); } public static <T> R<T> failed(T data) public static <T> R<T> fail(T data) { return restResult(data, Constants.FAIL, null); return restResult(data, FAIL, null); } public static <T> R<T> failed(T data, String msg) public static <T> R<T> fail(T data, String msg) { return restResult(data, Constants.FAIL, msg); return restResult(data, FAIL, msg); } public static <T> R<T> failed(int code, String msg) public static <T> R<T> fail(int code, String msg) { return restResult(null, code, msg); } ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/CustomAccessDeniedHandler.java
@@ -28,6 +28,6 @@ logger.info("权限不足,请联系管理员 {}", request.getRequestURI()); String msg = authException.getMessage(); ServletUtils.renderString(response, JSON.toJSONString(R.failed(HttpStatus.FORBIDDEN, msg))); ServletUtils.renderString(response, JSON.toJSONString(R.fail(HttpStatus.FORBIDDEN, msg))); } } ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java
New file @@ -0,0 +1,117 @@ package com.ruoyi.common.security.handler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.authentication.AccountExpiredException; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.validation.BindException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.NoHandlerFoundException; import com.ruoyi.common.core.constant.HttpStatus; import com.ruoyi.common.core.exception.BaseException; import com.ruoyi.common.core.exception.CustomException; import com.ruoyi.common.core.exception.DemoModeException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; /** * 全局异常处理器 * * @author ruoyi */ @RestControllerAdvice public class GlobalExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); /** * 基础异常 */ @ExceptionHandler(BaseException.class) public AjaxResult baseException(BaseException e) { return AjaxResult.error(e.getMessage()); } /** * 业务异常 */ @ExceptionHandler(CustomException.class) public AjaxResult businessException(CustomException e) { if (StringUtils.isNull(e.getCode())) { return AjaxResult.error(e.getMessage()); } return AjaxResult.error(e.getCode(), e.getMessage()); } @ExceptionHandler(NoHandlerFoundException.class) public AjaxResult handlerNoFoundException(Exception e) { log.error(e.getMessage(), e); return AjaxResult.error(HttpStatus.NOT_FOUND, "路径不存在,请检查路径是否正确"); } @ExceptionHandler(AccessDeniedException.class) public AjaxResult handleAuthorizationException(AccessDeniedException e) { log.error(e.getMessage()); return AjaxResult.error(HttpStatus.FORBIDDEN, "没有权限,请联系管理员授权"); } @ExceptionHandler(AccountExpiredException.class) public AjaxResult handleAccountExpiredException(AccountExpiredException e) { log.error(e.getMessage(), e); return AjaxResult.error(e.getMessage()); } @ExceptionHandler(UsernameNotFoundException.class) public AjaxResult handleUsernameNotFoundException(UsernameNotFoundException e) { log.error(e.getMessage(), e); return AjaxResult.error(e.getMessage()); } @ExceptionHandler(Exception.class) public AjaxResult handleException(Exception e) { log.error(e.getMessage(), e); return AjaxResult.error(e.getMessage()); } /** * 自定义验证异常 */ @ExceptionHandler(BindException.class) public AjaxResult validatedBindException(BindException e) { log.error(e.getMessage(), e); String message = e.getAllErrors().get(0).getDefaultMessage(); return AjaxResult.error(message); } /** * 自定义验证异常 */ @ExceptionHandler(MethodArgumentNotValidException.class) public Object validExceptionHandler(MethodArgumentNotValidException e) { log.error(e.getMessage(), e); String message = e.getBindingResult().getFieldError().getDefaultMessage(); return AjaxResult.error(message); } /** * 演示模式异常 */ @ExceptionHandler(DemoModeException.class) public AjaxResult demoModeException(DemoModeException e) { return AjaxResult.error("演示模式,不允许操作"); } } ruoyi-common/ruoyi-common-security/src/main/resources/META-INF/spring.factories
@@ -1,5 +1,6 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.ruoyi.common.security.service.UserDetailsServiceImpl,\ com.ruoyi.common.security.handler.CustomAccessDeniedHandler com.ruoyi.common.security.handler.CustomAccessDeniedHandler,\ com.ruoyi.common.security.handler.GlobalExceptionHandler ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java
New file @@ -0,0 +1,66 @@ package com.ruoyi.gateway.handler; import org.springframework.cloud.gateway.support.NotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.web.server.ResponseStatusException; import org.springframework.web.server.ServerWebExchange; import com.alibaba.fastjson.JSON; import com.ruoyi.common.core.domain.R; import reactor.core.publisher.Mono; /** * 网关统一异常处理 * * @author ruoyi */ @Order(-1) @Configuration public class GatewayExceptionHandler implements ErrorWebExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GatewayExceptionHandler.class); @Override public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) { ServerHttpResponse response = exchange.getResponse(); if (exchange.getResponse().isCommitted()) { return Mono.error(ex); } String msg; if (ex instanceof NotFoundException) { msg = "服务未找到"; } else if (ex instanceof ResponseStatusException) { ResponseStatusException responseStatusException = (ResponseStatusException) ex; msg = responseStatusException.getMessage(); } else { msg = "内部服务器错误"; } log.error("[网关异常处理]请求路径:{},异常信息:{}", exchange.getRequest().getPath(), ex.getMessage()); response.getHeaders().setContentType(MediaType.APPLICATION_JSON); response.setStatusCode(HttpStatus.OK); return response.writeWith(Mono.fromSupplier(() -> { DataBufferFactory bufferFactory = response.bufferFactory(); return bufferFactory.wrap(JSON.toJSONBytes(R.fail(msg))); })); } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -104,7 +104,7 @@ SysUser sysUser = userService.selectUserByUserName(username); if (StringUtils.isNull(sysUser)) { return R.failed("用户名或密码错误"); return R.fail("用户名或密码错误"); } // 角色集合 Set<String> roles = permissionService.getRolePermission(sysUser.getUserId());