mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 08:13:44 +08:00 
			
		
		
		
	update 优化 sse 异常单独处理 避免出现异常报错问题
This commit is contained in:
		@@ -0,0 +1,62 @@
 | 
			
		||||
package org.dromara.common.core.exception;
 | 
			
		||||
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.EqualsAndHashCode;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import java.io.Serial;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * sse 特制异常
 | 
			
		||||
 *
 | 
			
		||||
 * @author LionLi
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@EqualsAndHashCode(callSuper = true)
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
public final class SseException extends RuntimeException {
 | 
			
		||||
 | 
			
		||||
    @Serial
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 错误码
 | 
			
		||||
     */
 | 
			
		||||
    private Integer code;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 错误提示
 | 
			
		||||
     */
 | 
			
		||||
    private String message;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 错误明细,内部调试错误
 | 
			
		||||
     */
 | 
			
		||||
    private String detailMessage;
 | 
			
		||||
 | 
			
		||||
    public SseException(String message) {
 | 
			
		||||
        this.message = message;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public SseException(String message, Integer code) {
 | 
			
		||||
        this.message = message;
 | 
			
		||||
        this.code = code;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getMessage() {
 | 
			
		||||
        return message;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public SseException setMessage(String message) {
 | 
			
		||||
        this.message = message;
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public SseException setDetailMessage(String detailMessage) {
 | 
			
		||||
        this.detailMessage = detailMessage;
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -7,9 +7,11 @@ import cn.dev33.satoken.interceptor.SaInterceptor;
 | 
			
		||||
import cn.dev33.satoken.router.SaRouter;
 | 
			
		||||
import cn.dev33.satoken.stp.StpUtil;
 | 
			
		||||
import cn.dev33.satoken.util.SaResult;
 | 
			
		||||
import jakarta.servlet.http.HttpServletRequest;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.dromara.common.core.constant.HttpStatus;
 | 
			
		||||
import org.dromara.common.core.exception.SseException;
 | 
			
		||||
import org.dromara.common.core.utils.ServletUtils;
 | 
			
		||||
import org.dromara.common.core.utils.SpringUtils;
 | 
			
		||||
import org.dromara.common.core.utils.StringUtils;
 | 
			
		||||
@@ -50,11 +52,20 @@ public class SecurityConfig implements WebMvcConfigurer {
 | 
			
		||||
                    .match(allUrlHandler.getUrls())
 | 
			
		||||
                    // 对未排除的路径进行检查
 | 
			
		||||
                    .check(() -> {
 | 
			
		||||
                        HttpServletRequest request = ServletUtils.getRequest();
 | 
			
		||||
                        // 检查是否登录 是否有token
 | 
			
		||||
                        StpUtil.checkLogin();
 | 
			
		||||
                        try {
 | 
			
		||||
                            StpUtil.checkLogin();
 | 
			
		||||
                        } catch (NotLoginException e) {
 | 
			
		||||
                            if (request.getRequestURI().contains("sse")) {
 | 
			
		||||
                                throw new SseException(e.getMessage(), e.getCode());
 | 
			
		||||
                            } else {
 | 
			
		||||
                                throw e;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        // 检查 header 与 param 里的 clientid 与 token 里的是否一致
 | 
			
		||||
                        String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY);
 | 
			
		||||
                        String headerCid = request.getHeader(LoginHelper.CLIENT_KEY);
 | 
			
		||||
                        String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY);
 | 
			
		||||
                        String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString();
 | 
			
		||||
                        if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) {
 | 
			
		||||
 
 | 
			
		||||
@@ -9,9 +9,9 @@ import jakarta.validation.ConstraintViolationException;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.dromara.common.core.domain.R;
 | 
			
		||||
import org.dromara.common.core.exception.ServiceException;
 | 
			
		||||
import org.dromara.common.core.exception.SseException;
 | 
			
		||||
import org.dromara.common.core.exception.base.BaseException;
 | 
			
		||||
import org.dromara.common.core.utils.StreamUtils;
 | 
			
		||||
import org.dromara.common.core.utils.StringUtils;
 | 
			
		||||
import org.springframework.context.support.DefaultMessageSourceResolvable;
 | 
			
		||||
import org.springframework.validation.BindException;
 | 
			
		||||
import org.springframework.web.HttpRequestMethodNotSupportedException;
 | 
			
		||||
@@ -55,20 +55,25 @@ public class GlobalExceptionHandler {
 | 
			
		||||
        return ObjectUtil.isNotNull(code) ? R.fail(code, e.getMessage()) : R.fail(e.getMessage());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 认证失败
 | 
			
		||||
     */
 | 
			
		||||
    @ResponseStatus(org.springframework.http.HttpStatus.UNAUTHORIZED)
 | 
			
		||||
    @ExceptionHandler(SseException.class)
 | 
			
		||||
    public String handleNotLoginException(SseException e, HttpServletRequest request) {
 | 
			
		||||
        String requestURI = request.getRequestURI();
 | 
			
		||||
        log.error("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, e.getMessage());
 | 
			
		||||
        return e.getMessage();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * servlet异常
 | 
			
		||||
     */
 | 
			
		||||
    @ExceptionHandler(ServletException.class)
 | 
			
		||||
    public R<Void> handleServletException(ServletException e, HttpServletRequest request) {
 | 
			
		||||
        if (StringUtils.contains(e.getMessage(), "NotLoginException")) {
 | 
			
		||||
            String requestURI = request.getRequestURI();
 | 
			
		||||
            log.error("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, e.getMessage());
 | 
			
		||||
            return R.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源");
 | 
			
		||||
        } else {
 | 
			
		||||
            String requestURI = request.getRequestURI();
 | 
			
		||||
            log.error("请求地址'{}',发生未知异常.", requestURI, e);
 | 
			
		||||
            return R.fail(e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
        String requestURI = request.getRequestURI();
 | 
			
		||||
        log.error("请求地址'{}',发生未知异常.", requestURI, e);
 | 
			
		||||
        return R.fail(e.getMessage());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user