Back to Sa Token

异常细分状态码

sa-token-doc/fun/exception-code.md

1.45.07.8 KB
Original Source

异常细分状态码


获取异常细分状态码

Sa-Token 中的基础异常类是 SaTokenException,在此基础上,又针对一些特定场景划分出诸如 NotLoginExceptionNotPermissionException 等。

但是框架中异常抛出点远远多于异常种类的划分,比如在 SSO 插件中,[ redirect 重定向地址无效 ] 和 [ ticket 参数值无效 ] 都会导致 SSO 授权的失败, 但是它们抛出的异常都是 SaSsoException,如果你需要对这两种异常情形做出不同的处理,仅仅判断异常的 ClassType 显然不够。

为了解决上述需求,Sa-Token 对每个异常抛出点都会指定一个特定的 code 值,就像这样:

java
if(SaFoxUtil.isUrl(url) == false) {
	throw new SaSsoException("无效redirect:" + url).setCode(SaSsoErrorCode.CODE_30001);	
}

就像是打上一个特定的标记,不同异常情形标记的 code 码值也会不同,这就为你精细化异常处理提供了前提。

要在捕获异常时获取这个 code 码也非常简单:

java
@RestControllerAdvice
public class GlobalExceptionHandler {
	@ExceptionHandler(SaTokenException.class)
	public SaResult handlerSaTokenException(SaTokenException e) {
		
		// 根据不同异常细分状态码返回不同的提示 
		if(e.getCode() == 30001) {
			return SaResult.error("redirect 重定向 url 是一个无效地址");
		}
		if(e.getCode() == 30002) {
			return SaResult.error("redirect 重定向 url 不在 allowUrl 允许的范围内");
		}
		if(e.getCode() == 30004) {
			return SaResult.error("提供的 ticket 是无效的");
		}
		// 更多 code 码判断 ... 
		
		// 默认的提示 
		return SaResult.error("服务器繁忙,请稍后重试...");
	}
}

SaToken 中的所有异常都是继承于 SaTokenException 的,也就是说,所有异常你都可以通过 e.getCode() 的方式获取对应的异常细分状态码。

异常细分状态码-参照表

sa-token-code 核心包

code码值含义
-1代表这个异常在抛出时未指定异常细分状态码
10001未能获取有效的上下文处理器
10002未能获取有效的上下文
10003JSON 转换器未实现
10011未能从全局 StpLogic 集合中找到对应 type 的 StpLogic
10021指定的配置文件加载失败
10022配置文件属性无法正常读取
10031重置的侦听器集合不可以为空
10032注册的侦听器不可以为空
10301提供的 Same-Token 是无效的
10311表示未能通过 Http Basic 认证校验
10321提供的 HttpMethod 是无效的
11001未能读取到有效Token
11002登录时的账号id值为空
11003更改 Token 指向的 账号Id 时,账号Id值为空
11011未能读取到有效Token
11012Token无效
11013Token已过期
11014Token已被顶下线
11015Token已被踢下线
11016Token已被冻结
11031在未集成 sa-token-jwt 插件时调用 getExtra() 抛出异常
11041缺少指定的角色
11051缺少指定的权限
11061当前账号未通过服务封禁校验
11062提供要解禁的账号无效
11063提供要解禁的服务无效
11064提供要解禁的等级无效
11071二级认证校验未通过
12001请求中缺少指定的参数
12002构建 Cookie 时缺少 name 参数
12003构建 Cookie 时缺少 value 参数
12101Base64 编码异常
12102Base64 解码异常
12103URL 编码异常
12104URL 解码异常
12111md5 加密异常
12112sha1 加密异常
12113sha256 加密异常
12114AES 加密异常
12115AES 解密异常
12116RSA 公钥加密异常
12117RSA 私钥加密异常
12118RSA 公钥解密异常
12119RSA 私钥解密异常
12201参与参数签名的秘钥不可为空
12202给定的签名无效
12203timestamp 超出允许的范围

sa-token-servlet

code码值含义
20001转发失败
20002重定向失败

sa-token-spring-boot-starter

code码值含义
20101企图在非 Web 上下文获取 Request、Response 等对象
20103对象转 JSON 字符串失败
20104JSON 字符串转 Map 失败
20105默认的 Filter 异常处理函数

sa-token-reactor-spring-boot-starter

code码值含义
20203对象转 JSON 字符串失败
20204JSON 字符串转 Map 失败
20205默认的 Filter 异常处理函数

sa-token-solon-plugin

code码值含义
20301默认的拦截器异常处理函数
20302默认的 Filter 异常处理函数

sa-token-sso 单点登录相关:

code码值含义
30001redirect 重定向 url 是一个无效地址
30002redirect 重定向 url 不在 allowUrl 允许的范围内
30003接口调用方提供的 secretkey 秘钥无效
30004提供的 ticket 是无效的
30005在模式三下,sso-client 调用 sso-server 端 校验ticket接口 时,得到的响应是校验失败
30006在模式三下,sso-client 调用 sso-server 端 单点注销接口 时,得到的响应是注销失败
30007http 请求调用 提供的 timestamp 与当前时间的差距超出允许的范围
30008http 请求调用 提供的 sign 无效
30009本地系统没有配置 secretkey 字段
30010本地系统没有配置 http 请求处理器
30011该 ticket 不属于当前 client

sa-token-oauth2 相关:

code码值含义
30101client_id 不可为空
30102scope 不可为空
30103redirect_uri 不可为空
30104LoginId 不可为空
30105无效 client_id
30106无效 access_token
30107无效 client_token
30108Access-Token 不具备指定的 Scope
30109Client-Token 不具备指定的 Scope
30110无效 code 码
30111无效 Refresh-Token
30112请求的 Scope 暂未签约
30113无效 redirect_url
30114非法 redirect_url
30115无效 client_secret
30120redirect_uri 不一致
30122client_id 不一致
30125无效 response_type
30126无效 grant_type
30127无效 state
30141系统暂未开放的授权模式
30142应用暂未开放的授权模式
30151无效的请求 Method
30191其它异常

sa-token-jwt 插件相关:

code码值含义
30201对 jwt 字符串解析失败
30202此 jwt 的签名无效
30203此 jwt 的 loginType 字段不符合预期
30204此 jwt 已超时
30205没有配置jwt秘钥
30206登录时提供的账号id为空

sa-token-temp-jwt 插件相关:

code码值含义
30301jwt 模式没有提供秘钥
30302jwt 模式不可以删除 Token
30303Token已超时

[!WARNING| label:注意] 部分插件因异常抛出点较少,暂未做状态码细分处理