diff --git a/sa-token-doc/doc/_sidebar.md b/sa-token-doc/doc/_sidebar.md index 3e3e024c..c0e35b0e 100644 --- a/sa-token-doc/doc/_sidebar.md +++ b/sa-token-doc/doc/_sidebar.md @@ -70,6 +70,14 @@ - [和 Dubbo 集成](/plugin/dubbo-extend) - [Sa-Token 插件开发指南](/fun/plugin-dev) +- **API手册** + - [StpUtil-鉴权工具类](/api/stp-util) + - [SaSession-会话对象](/api/sa-session) + - [SaTokenDao-数据持久接口](/api/sa-token-dao) + - [SaStrategy-全局策略](/api/sa-strategy) + - [全局类、方法](/more/common-action) + + - **其它** - [更新日志](/more/update-log) - [框架生态](/more/link) @@ -79,7 +87,6 @@ - [赞助 Sa-Token](/more/sa-token-donate) - **附录** - - [常用类、方法](/more/common-action) - [常见问题排查](/more/common-questions) - [框架名词解释](/more/noun-intro) - [Sa-Token功能结构图](/fun/auth-flow) diff --git a/sa-token-doc/doc/api/sa-session.md b/sa-token-doc/doc/api/sa-session.md new file mode 100644 index 00000000..6c210773 --- /dev/null +++ b/sa-token-doc/doc/api/sa-session.md @@ -0,0 +1,77 @@ +# SaSession-会话对象 + +SaSession-会话对象,专业数据缓存组件。 + +--- + +### 1、常量 +``` java +SaSession.ROLE_LIST = "USER"; // 在 Session 上存储用户对象时建议使用的key +SaSession.ROLE_LIST = "ROLE_LIST"; // 在 Session 上存储角色时建议使用的key +SaSession.PERMISSION_LIST = "PERMISSION_LIST"; // 在 Session 上存储权限时建议使用的key +``` + + +### 2、构建相关 +``` java +session.getId(); // 获取此 Session 的 id +session.setId(id); // 写入此 Session 的 id +session.getCreateTime(); // 返回当前会话创建时间(时间戳) +session.setCreateTime(createTime); // 写入此 Session 的创建时间(时间戳) +``` + + +### 3、TokenSign 相关 +``` java +session.setTokenSignList(tokenSignList); // 写入此 Session 绑定的 Token 签名列表 +session.getTokenSignList(); // 获取此 Session 绑定的 Token 签名列表 +session.tokenSignListCopy(); // 获取 Token 签名列表 的拷贝副本 +session.tokenSignListCopyByDevice(device); // 返回 Token 签名列表 的拷贝副本,根据 device 筛选 +session.getTokenSign(tokenValue); // 查找一个 Token 签名 +session.addTokenSign(tokenSign); // 添加一个 Token 签名 +session.addTokenSign(tokenValue, device); // 添加一个 Token 签名 +session.removeTokenSign(tokenValue); // 移除一个 Token 签名 +``` + + +### 4、一些操作 +``` java +session.update(); // 更新Session(从持久库更新刷新一下) +session.logout(); // 注销Session (从持久库删除) +session.logoutByTokenSignCountToZero(); // 当Session上的tokenSign数量为零时,注销会话 +session.getTimeout(); // 获取此Session的剩余存活时间 (单位: 秒) +session.updateTimeout(timeout); // 修改此Session的剩余存活时间 +session.updateMinTimeout(minTimeout); // 修改此Session的最小剩余存活时间 (只有在 Session 的过期时间低于指定的 minTimeout 时才会进行修改) +session.updateMaxTimeout(maxTimeout); // 修改此Session的最大剩余存活时间 (只有在 Session 的过期时间高于指定的 maxTimeout 时才会进行修改) +session.trans(value); // value为 -1 时返回 Long.MAX_VALUE,否则原样返回 +``` + + +### 5、存取值 +``` java +session.get(key); // 取值 +session.get(key, defaultValue); // 取值 (指定默认值) +session.get(key, () -> {}); // 取值 (如果值为 null,则执行 fun 函数获取值,并把函数返回值写入缓存) +session.getString(key); // 取值 (转String类型) +session.getInt(key); // 取值 (转int类型) +session.getLong(key); // 取值 (转long类型) +session.getDouble(key); // 取值 (转double类型) +session.getFloat(key); // 取值 (转float类型) +session.getModel(key, clazz); // 取值 (指定转换类型) +session.getModel(key, clazz, defaultValue); // 取值 (指定转换类型, 并指定值为Null时返回的默认值) +session.has(key); // 是否含有某个key +session.set(key, value); // 写值 +session.setByNull(key, value); // 写值 (只有在此 key 原本无值的情况下才会写入) +session.delete(key); // 删值 +session.keys(); // 返回当前Session的所有key +session.clear(); // 清空所有值 +session.getDataMap(); // 获取数据挂载集合(如果更新map里的值,请调用session.update()方法避免产生脏数据 ) +session.refreshDataMap(dataMap); // 写入数据集合 (不改变底层对象,只将此dataMap所有数据进行替换) +``` + + + + + + + diff --git a/sa-token-doc/doc/api/sa-strategy.md b/sa-token-doc/doc/api/sa-strategy.md new file mode 100644 index 00000000..7529e8cb --- /dev/null +++ b/sa-token-doc/doc/api/sa-strategy.md @@ -0,0 +1,74 @@ +# SaStrategy-全局策略 + +SaStrategy-全局策略,核心逻辑的代理封装。 + +--- + +### 所有策略 + +``` java +/** + * 创建 Token 的策略 + *

参数 [账号id, 账号类型] + */ +public BiFunction createToken = (loginId, loginType) -> { + // 默认,还是uuid + return "xxxxx-xxxxx-xxxxx-xxxxx"; +}; + +/** + * 创建 Session 的策略 + *

参数 [SessionId] + */ +public Function createSession = (sessionId) -> { + return new SaSession(sessionId); +}; + +/** + * 判断:集合中是否包含指定元素(模糊匹配) + *

参数 [集合, 元素] + */ +public BiFunction, String, Boolean> hasElement = (list, element) -> { + return false; +}; + +/** + * 对一个 [Method] 对象进行注解校验 (注解鉴权内部实现) + *

参数 [Method句柄] + */ +public Consumer checkMethodAnnotation = (method) -> { + // ... +}; + +/** + * 对一个 [元素] 对象进行注解校验 (注解鉴权内部实现) + *

参数 [element元素] + */ +public Consumer checkElementAnnotation = (target) -> { + // ... +}; + +/** + * 从元素上获取注解(注解鉴权内部实现) + *

参数 [element元素,要获取的注解类型] + */ +public BiFunction , Annotation> getAnnotation = (element, annotationClass)->{ + // 默认使用jdk的注解处理器 + return element.getAnnotation(annotationClass); +}; + +/** + * 拼接两个url + *

例如:url1=http://domain.cn,url2=/sso/auth,则返回:http://domain.cn/sso/auth + *

参数 [第一个url, 第二个url] + */ +public BiFunction spliceTwoUrl = (url1, url2) -> { + return xxx; +}; +``` + + + + + + diff --git a/sa-token-doc/doc/api/sa-token-dao.md b/sa-token-doc/doc/api/sa-token-dao.md new file mode 100644 index 00000000..a2d95292 --- /dev/null +++ b/sa-token-doc/doc/api/sa-token-dao.md @@ -0,0 +1,61 @@ +# SaTokenDao-数据持久接口 + +SaTokenDao 是数据持久层接口,负责所有会话数据的底层写入和读取。 + +--- + +### 1、常量 +``` java +SaTokenDao.NEVER_EXPIRE = -1; // 常量,表示一个key永不过期 (在一个key被标注为永远不过期时返回此值) +SaTokenDao.NOT_VALUE_EXPIRE = -2; // 常量,表示系统中不存在这个缓存 (在对不存在的key获取剩余存活时间时返回此值) +``` + + +### 2、字符串读写 +``` java +dao.get(key); // 获取Value,如无返空 +dao.set(key, value, timeout); // 写入Value,并设定存活时间 (单位: 秒) +dao.update(key, value); // 更新Value (过期时间不变) +dao.delete(key); // 删除Value +dao.getTimeout(key); // 获取Value的剩余存活时间 (单位: 秒) +dao.updateTimeout(key, timeout); // 修改Value的剩余存活时间 (单位: 秒) +``` + + +### 3、对象读写 +``` java +dao.getObject(key); // 获取Object,如无返空 +dao.setObject(key, value, timeout); // 写入Object,并设定存活时间 (单位: 秒) +dao.setObject(key, value); // 更新Object (过期时间不变) +dao.deleteObject(key); // 删除Object +dao.getObjectTimeout(key); // 获取Object的剩余存活时间 (单位: 秒) +dao.updateObjectTimeout(key, timeout); // 修改Object的剩余存活时间 (单位: 秒) +``` + + +### 4、Session读写 +``` java +dao.getSession(sessionId); // 获取Session,如无返空 +dao.setSession(session, timeout); // 写入Session,并设定存活时间 (单位: 秒) +dao.setSession(session); // 更新Session (过期时间不变) +dao.deleteSession(sessionId); // 删除Session +dao.getSessionTimeout(sessionId); // 获取Session的剩余存活时间 (单位: 秒) +dao.updateSessionTimeout(sessionId, timeout); // 修改Session的剩余存活时间 (单位: 秒) +``` + + +### 5、会话管理 +``` java +dao.searchData(prefix, keyword, start, size, sortType); // 搜索数据 +``` + + + + + + + + + + + diff --git a/sa-token-doc/doc/api/stp-util.md b/sa-token-doc/doc/api/stp-util.md new file mode 100644 index 00000000..2e7ee315 --- /dev/null +++ b/sa-token-doc/doc/api/stp-util.md @@ -0,0 +1,179 @@ +# StpUtil - 鉴权工具类 + +StpUtil 是 Sa-Token 整体功能的核心,大多数功能均由此工具类提供。 + +--- + +### 1、常规操作 +``` java +StpUtil.getStpLogic(); // 获取底层 StpLogic 对象。 +StpUtil.setStpLogic(newStpLogic); // 安全的重置底层 StpLogic 引用。 +StpUtil.getLoginType(); // 获取账号类型 (例如:login、user、admin、teacher、student等等)。 +StpUtil.getTokenName(); // 获取 Token 的名称 +StpUtil.getTokenValue(); // 获取本次请求前端提交的 Token。 +StpUtil.getTokenValueNotCut(); // 获取本次请求前端提交的 Token (不裁剪前缀) 。 +StpUtil.setTokenValue(tokenValue); // 在当前会话中写入 Token 值。 +StpUtil.setTokenValue(tokenValue, timeout); // 在当前会话中写入 Token 值,并指定 Cookie 有效期。 +StpUtil.getTokenInfo(); // 获取当前 Token 的详细参数。 +``` + + +### 2、登录相关 +``` java +StpUtil.login(10001); // 会话登录 +StpUtil.login(10001, "APP"); // 会话登录,并指定设备类型 +StpUtil.login(10001, true); // 会话登录,并指定是否 [记住我] +StpUtil.login(10001, loginModel); // 会话登录,并指定所有登录参数Model +StpUtil.createLoginSession(10001); // 创建指定账号id的登录会话,此方法不会将 Token 注入到上下文 +StpUtil.createLoginSession(10001, loginModel); // 创建指定账号id的登录会话,此方法不会将 Token 注入到上下文 +``` + +SaLoginModel 配置示例: +``` java +// SaLoginModel 配置登录相关参数 +StpUtil.login(10001, new SaLoginModel() + .setDevice("PC") // 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型 + .setIsLastingCookie(true) // 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在) + .setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的 timeout 值) + .setToken("xxxx-xxxx-xxxx-xxxx") // 预定此次登录生成的Token + .setExtra("name", "zhangsan") // Token挂载的扩展参数 (此方法只有在集成jwt插件时才会生效) + ); +``` + + +### 3、注销相关 +``` java +StpUtil.logout(); // 会话注销 +StpUtil.logout(10001); // 会话注销,根据账号id +StpUtil.logout(10001, "PC"); // 会话注销,根据账号id 和 设备类型 +StpUtil.logoutByTokenValue(token); // 指定 Token 强制注销 +StpUtil.kickout(10001); // 踢人下线 +StpUtil.kickout(10001, "PC"); // 踢人下线,根据账号id +StpUtil.kickoutByTokenValue(token); // 踢人下线,根据账号id 和 设备类型 +``` + + +### 4、会话查询 +``` java +StpUtil.isLogin(); // 当前会话是否已经登录 +StpUtil.checkLogin(); // 检验当前会话是否已经登录,如未登录,则抛出异常 +StpUtil.getLoginId(); // 获取当前会话账号id, 如果未登录,则抛出异常 +StpUtil.getLoginId(defaultValue); // 获取当前会话账号id, 如果未登录,则返回默认值 +StpUtil.getLoginIdDefaultNull(); // 获取当前会话账号id, 如果未登录,则返回null +StpUtil.getLoginIdAsString(); // 获取当前会话账号id, 并转换为String类型 +StpUtil.getLoginIdAsInt(); // 获取当前会话账号id, 并转换为int类型 +StpUtil.getLoginIdAsLong(); // 获取当前会话账号id, 并转换为long类型 +StpUtil.getLoginIdByToken(token); // 获取指定Token对应的账号id,如果未登录,则返回 null +StpUtil.getExtra(key); // 获取当前 Token 的扩展信息(此函数只在jwt模式下生效) +StpUtil.getExtra(token, key); // 获取指定 Token 的扩展信息(此函数只在jwt模式下生效) +``` + + +### 5、Session 相关 +``` java +// User-Session 相关 +StpUtil.getSession(); // 获取当前会话的Session,如果Session尚未创建,则新建并返回 +StpUtil.getSession(true); // 获取当前会话的Session, 如果Session尚未创建,isCreate=是否新建并返回 +StpUtil.getSessionByLoginId(10001); // 获取指定账号id的Session,如果Session尚未创建,则新建并返回 +StpUtil.getSessionByLoginId(10001, true); // 获取指定账号id的Session, 如果Session尚未创建,isCreate=是否新建并返回 + +// Token-Session 相关 +StpUtil.getTokenSession(); // 获取当前会话的Session,如果Session尚未创建,则新建并返回 +StpUtil.getTokenSessionByToken(token); // 获取指定Token-Session,如果Session尚未创建,则新建并返回 +StpUtil.getAnonTokenSession(); // 获取当前匿名 Token-Session (可在未登录情况下使用的Token-Session) + +// 其它 +StpUtil.getSessionBySessionId("xxxx-xxxx-xxxx"); // 获取指定key的Session, 如果Session尚未创建,则返回 null +``` + + +### 6、Token有效期相关 +``` java +// 临时有效期 +StpUtil.getTokenActivityTimeout(); // 获取当前 token [临时过期] 剩余有效时间 (单位: 秒) +StpUtil.checkActivityTimeout(); // 检查当前token 是否已经[临时过期],如果已经过期则抛出异常 +StpUtil.updateLastActivityToNow(); // 续签当前token:(将 [最后操作时间] 更新为当前时间戳) + +// 长久有效期 +StpUtil.getTokenTimeout(); // 获取当前登录者的 token 剩余有效时间 (单位: 秒) +StpUtil.getSessionTimeout(); // 获取当前登录者的 User-Session 剩余有效时间 (单位: 秒) +StpUtil.getTokenSessionTimeout(); // 获取当前 Token-Session 剩余有效时间 (单位: 秒) +StpUtil.renewTimeout(timeout); // 对当前 Token 的 timeout 值进行续期 +StpUtil.renewTimeout(token, timeout); // 对指定 Token 的 timeout 值进行续期 +``` + + +### 7、角色认证 +``` java +StpUtil.getRoleList(); // 获取:当前账号的角色集合 +StpUtil.getRoleList(10001); // 获取:指定账号的角色集合 +StpUtil.hasRole(role); // 判断:当前账号是否拥有指定角色, 返回true或false +StpUtil.hasRole(loginId, role); // 判断:指定账号是否含有指定角色标识, 返回true或false +StpUtil.hasRoleAnd(...roleArray); // 判断:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] +StpUtil.hasRoleOr(...roleArray); // 判断:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可] +StpUtil.checkRole(role); // 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException +StpUtil.checkRoleAnd(...roleArray); // 校验:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] +StpUtil.checkRoleOr(...roleArray); // 校验:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可] +``` + + +### 8、权限认证 +``` java +StpUtil.getPermissionList(); // 获取:当前账号的权限集合 +StpUtil.getPermissionList(10001); // 获取:指定账号的权限集合 +StpUtil.hasPermission(permission); // 判断:当前账号是否拥有指定权限, 返回true或false +StpUtil.hasPermission(loginId, permission); // 判断:指定账号是否含有指定权限标识, 返回true或false +StpUtil.hasPermissionAnd(...permissionArray); // 判断:当前账号是否含有指定权限标识 [指定多个,必须全部验证通过] +StpUtil.hasPermissionOr(...permissionArray); // 判断:当前账号是否含有指定权限标识 [指定多个,只要其一验证通过即可] +StpUtil.checkPermission(permission); // 校验:当前账号是否含有指定权限标识, 如果验证未通过,则抛出异常: NotRoleException +StpUtil.checkPermissionAnd(...permissionArray); // 校验:当前账号是否含有指定权限标识 [指定多个,必须全部验证通过] +StpUtil.checkPermissionOr(...permissionArray); // 校验:当前账号是否含有指定权限标识 [指定多个,只要其一验证通过即可] +``` + + +### 9、id 反查 Token +``` java +StpUtil.getTokenValueByLoginId(10001); // 获取指定账号id的tokenValue +StpUtil.getTokenValueByLoginId(10001, "PC"); // 获取指定账号id指定设备类型端的tokenValue +StpUtil.getTokenValueListByLoginId(10001); // 获取指定账号id的tokenValue集合 +StpUtil.getTokenValueListByLoginId(10001, "APP"); // 获取指定账号id指定设备类型端的tokenValue 集合 +StpUtil.getLoginDevice(); // 返回当前会话的登录设备类型 +``` + + +### 10、会话管理 +``` java +StpUtil.searchTokenValue(keyword, start, size, sortType); // 根据条件查询Token +StpUtil.searchSessionId(keyword, start, size, sortType); // 根据条件查询SessionId +StpUtil.searchTokenSessionId(keyword, start, size, sortType); // 根据条件查询Token专属Session的Id +``` +详细可参考:[会话治理](/up/search-session) + + +### 11、账号封禁 +``` java +StpUtil.disable(10001, 1200); // 封禁指定账号 +StpUtil.disable(10001); // 指定账号是否已被封禁 (true=已被封禁, false=未被封禁) +StpUtil.getDisableTime(10001); // 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) +StpUtil.untieDisable(loginId); // 解封指定账号 +``` + + +### 12、身份切换 +``` java +StpUtil.switchTo(10044); // 临时切换身份为指定账号id +StpUtil.endSwitch(); // 结束临时切换身份 +StpUtil.isSwitch(); // 当前是否正处于[身份临时切换]中 +StpUtil.switchTo(10044, () -> {}); // 在一个代码段里方法内,临时切换身份为指定账号id +``` + + +### 13、二级认证 +``` java +StpUtil.openSafe(safeTime); // 在当前会话 开启二级认证 +StpUtil.isSafe(); // 当前会话 是否处于二级认证时间内 +StpUtil.checkSafe(); // 检查当前会话是否已通过二级认证,如未通过则抛出异常 +StpUtil.getSafeTime(); // 获取当前会话的二级认证剩余有效时间 (单位: 秒, 返回-2代表尚未通过二级认证) +StpUtil.closeSafe(); // 在当前会话 结束二级认证 +``` + diff --git a/sa-token-doc/doc/more/common-action.md b/sa-token-doc/doc/more/common-action.md index c1397499..c4b6da58 100644 --- a/sa-token-doc/doc/more/common-action.md +++ b/sa-token-doc/doc/more/common-action.md @@ -1,28 +1,34 @@ -# 常用类、方法 -本篇介绍Sa-Token中一些常用的全局对象、类 +# 全局类、方法 +本篇介绍 Sa-Token 中一些常用的全局对象、类 --- ### SaManager -SaManager 负责管理 Sa-Token 所有运行时对象 +SaManager 负责管理 Sa-Token 所有全局组件。 ``` java -SaManager.getConfig(); // 获取全局配置对象 -SaManager.getSaTokenDao(); // 获取数据持久化对象 -SaManager.getStpInterface(); // 获取权限认证对象 -SaManager.getSaTokenAction(); // 获取框架行为对象 -SaManager.getSaTokenContext(); // 获取上下文处理对象 -SaManager.getSaTokenListener(); // 获取侦听器对象 -SaManager.getSaTemp(); // 获取临时令牌认证模块对象 -SaManager.getStpLogic("type"); // 获取指定账号类型的StpLogic对象 +SaManager.getConfig(); // 获取全局配置对象 +SaManager.getSaTokenDao(); // 获取数据持久化对象 +SaManager.getStpInterface(); // 获取权限认证对象 +SaManager.getSaTokenContext(); // 获取一级Context处理对象 +SaManager.getSaTokenSecondContext(); // 获取二级Context处理对象 +SaManager.getSaTokenContextOrSecond(); // 获取一个可用的 Context 处理对象 +SaManager.getSaTokenListener(); // 获取侦听器对象 +SaManager.getSaTemp(); // 获取临时令牌认证模块对象 +SaManager.getSaJsonTemplate(); // 获取 JSON 转换器 Bean +SaManager.getSaSignTemplate(); // 获取参数签名 Bean +SaManager.getStpLogic("type"); // 获取指定账号类型的StpLogic对象 +SaManager.putStpLogic(stpLogic); // 向全局集合中 put 一个 StpLogic ``` ### SaHolder Sa-Token上下文持有类,通过此类快速获取当前环境的相关对象 ``` java +SaHolder.getContext(); // 获取当前请求的 SaTokenContext SaHolder.getRequest(); // 获取当前请求的 [Request] 对象 SaHolder.getResponse(); // 获取当前请求的 [Response] 对象 -SaHolder.getStorage(); // 获取当前请求的 [存储器] 对象 +SaHolder.getStorage(); // 获取当前请求的 [Storage] 对象 +SaHolder.getApplication(); // 获取全局 SaApplication 对象 ``` @@ -36,14 +42,34 @@ Sa-Token内部工具类,包含一些工具方法 SaFoxUtil.printSaToken(); // 打印 Sa-Token 版本字符画 SaFoxUtil.getRandomString(8); // 生成指定长度的随机字符串 SaFoxUtil.isEmpty(str); // 指定字符串是否为null或者空字符串 +SaFoxUtil.isNotEmpty(str); // 指定字符串是否不是null或者空字符串 +SaFoxUtil.equals(a, b); // 比较两个对象是否相等 +SaFoxUtil.equals(a, b); // 比较两个对象是否相等 SaFoxUtil.getMarking28(); // 以当前时间戳和随机int数字拼接一个随机字符串 SaFoxUtil.formatDate(date); // 将日期格式化为yyyy-MM-dd HH:mm:ss字符串 -SaFoxUtil.searchList(); // 从集合里查询数据 +SaFoxUtil.searchList(dataList, prefix, keyword, start, size, sortType); // 从集合里查询数据 +SaFoxUtil.searchList(dataList, start, size, sortType); // 从集合里查询数据 SaFoxUtil.vagueMatch(patt, str); // 字符串模糊匹配 +SaFoxUtil.getValueByType(obj, cs); // 将指定值转化为指定类型 +SaFoxUtil.joinParam(url, parameStr); // 在url上拼接上kv参数并返回 +SaFoxUtil.joinParam(url, key, value); // 在url上拼接上kv参数并返回 +SaFoxUtil.joinSharpParam(url, parameStr); // 在url上拼接锚参数 +SaFoxUtil.joinSharpParam(url, key, value); // 在url上拼接锚参数 +SaFoxUtil.arrayJoin(arr); // 将数组的所有元素使用逗号拼接在一起 +SaFoxUtil.isUrl(str); // 使用正则表达式判断一个字符串是否为URL +SaFoxUtil.encodeUrl(str); // URL编码 +SaFoxUtil.decoderUrl(str); // URL解码 +SaFoxUtil.convertStringToList(str); // 将指定字符串按照逗号分隔符转化为字符串集合 +SaFoxUtil.convertListToString(list); // 将指定集合按照逗号连接成一个字符串 +SaFoxUtil.convertStringToArray(str); // String 转 Array,按照逗号切割 +SaFoxUtil.convertArrayToString(arr); // Array 转 String,按照逗号切割 +SaFoxUtil.emptyList(); // 返回一个空集合 +SaFoxUtil.toList(... strs); // String 数组转集合 ``` + ### SaTokenConfigFactory -配置对象工厂类,通过此类你可以方便的根据properties配置文件创建一个配置对象 +配置对象工厂类,通过此类你可以方便的根据 properties 配置文件创建一个配置对象 1、首先在项目根目录,创建一个配置文件:`sa-token.properties` @@ -80,6 +106,7 @@ SpringMVC操作的工具类,位于包:`sa-token-spring-boot-starter` ``` java SpringMVCUtil.getRequest(); // 获取本次请求的 request 对象 SpringMVCUtil.getResponse(); // 获取本次请求的 response 对象 +SpringMVCUtil.isWeb(); // 判断当前是否处于 Web 上下文中 ```