【Sa-Token】7、Sa-Token抛出的异常统一处理

在 Sa-Token 的登录,授权,验证过程中,会抛出很多的异常,我们不能将这些异常信息直接返回给用户,因为用户是看不懂这些异常信息的,我们就需要对这些异常信息进行处理,处理之后再返回展示给前端用户

1、统一异常处理

package com.asurplus.common.satoken;

import cn.dev33.satoken.exception.*;
import com.asurplus.common.utils.RES;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理
 *
 * @Author Lizhou
 */
@RestControllerAdvice
public class SaTokenExceptionHandler {

    @ExceptionHandler(NotLoginException.class)
    public RES handlerNotLoginException(NotLoginException nle) {
        // 不同异常返回不同状态码
        String message = "";
        if (nle.getType().equals(NotLoginException.NOT_TOKEN)) {
            message = "未提供Token";
        } else if (nle.getType().equals(NotLoginException.INVALID_TOKEN)) {
            message = "未提供有效的Token";
        } else if (nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
            message = "登录信息已过期,请重新登录";
        } else if (nle.getType().equals(NotLoginException.BE_REPLACED)) {
            message = "您的账户已在另一台设备上登录,如非本人操作,请立即修改密码";
        } else if (nle.getType().equals(NotLoginException.KICK_OUT)) {
            message = "已被系统强制下线";
        } else {
            message = "当前会话未登录";
        }
        // 返回给前端
        return RES.no(401, message);
    }

    @ExceptionHandler
    public RES handlerNotRoleException(NotRoleException e) {
        return RES.no(403, "无此角色:" + e.getRole());
    }

    @ExceptionHandler
    public RES handlerNotPermissionException(NotPermissionException e) {
        return RES.no(403, "无此权限:" + e.getCode());
    }

    @ExceptionHandler
    public RES handlerDisableLoginException(DisableLoginException e) {
        return RES.no(401, "账户被封禁:" + e.getDisableTime() + "秒后解封");
    }

    @ExceptionHandler
    public RES handlerNotSafeException(NotSafeException e) {
        return RES.no(401, "二级认证异常:" + e.getMessage());
    }
}

Sa-Token 会抛出的异常大概就有这些,你可以根据你实际的业务需求,对不用的异常场景返回不同的业务信息,方便前端开发人员做不同的处理

如您在阅读中发现不足,欢迎留言!!!

### sa-token与AOP集成概述 在Java Spring框架中,sa-token可以很好地与面向切面编程(AOP)相结合来实现权限控制和其他横切关注点的功能。通过这种方式,可以在不修改业务逻辑代码的情况下增强功能。 #### 使用sa-token进行身份验证授权 为了使sa-token能够利用AOP特性,在配置类中定义切入点表达式,这些表达式指定了哪些方法应该被拦截并应用额外的行为。通常情况下,这涉及到创建一个自定义注解用于标记受保护的方法或控制器端点[^1]。 ```java @Aspect @Component public class SaTokenAop { @Autowired private StpInterface stpLogic; /** * 定义切入点, 对所有controller包下的接口进行监控 */ @Pointcut("execution(public * com.example.controller..*.*(..))") public void controllerLayer() {} /** * 切入点执行之前触发该函数 * * @param joinPoint 连接点对象 */ @Before("controllerLayer()") public void doBefore(JoinPoint joinPoint){ // 获取当前请求的token String token = SaHolder.getRequest().getHeader("Authorization"); try { // 验证token有效性 boolean verifyResult = StpUtil.checkLogin(); if (!verifyResult) { throw new NotLoginException("未登录异常!"); } // 可选: 执行更多基于角色或其他条件的身份验证 } catch (NotLoginException e) { // 处理认证失败的情况 ResponseUtil.out(ServletActionContext.getResponse(), Result.error(e.getMessage())); return; } System.out.println("[Sa-Token] >>>> 请求路径:" + ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getServletPath()); System.out.println("[Sa-Token] >>>> 控制层正常进入..."); } } ``` 此代码片段展示了如何设置`@Aspect`组件以监听特定于控制器层(`com.example.controller`)的所有公共方法调用,并在其前实施安全检查。如果检测到用户尚未登录,则抛出异常阻止进一步处理;否则允许继续访问目标资源。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Asurplus

学如逆水行舟,不进则退

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值