会话治理全局侦听器全局过滤器多账号认证redis业务数据和权限数据分离开
sa-token官网文档
// 查询所有token StpUtil.searchTokenValue(String keyword, int start, int size); // 查询所有账号Session会话 StpUtil.searchSessionId(String keyword, int start, int size); // 查询所有令牌Session会话 StpUtil.searchTokenSessionId(String keyword, int start, int size);
keyword: 查询关键字,只有包括这个字符串的token值才会被查询出来
start: 数据开始处索引, 值为-1时代表一次性取出所有数据
size: 要获取的数据条数
// 查询value包括1000的所有token,结果集从第0条开始,返回10条 ListtokenList = StpUtil.searchTokenValue("1000", 0, 10); for (String token : tokenList) { System.out.println(token); }
全局侦听器注意事项:
由于会话查询底层采用了遍历方式获取数据,当数据量过大时此操作将会比较耗时
单机模式下:百万会话取出10条token平均耗时 0.255s
Redis模式下:百万会话取出10条token平均耗时 3.322s
请根据业务实际水平合理调用API
(实施获取用WebSocket)
接口SaTokenListener是Sa-Token的全局侦听器,通过实现此接口,你可以在用户登陆、退出、被踢下线等关键性操作时进行一些AOP操作
框架对此侦听器的默认实现是log日志输出,你可以通过配置sa-token.is-log=true开启
可以写自己的业务逻辑,日志记录等
效果图:
@Component
public class MySaTokenListener implements SaTokenListener {
@Override
public void doLogin(String loginType, Object loginId, SaLoginModel loginModel) {
System.out.println("登录了----------");
// ...
}
@Override
public void doLogout(String loginType, Object loginId, String tokenValue) {
System.out.println("注销了----------");
// ...
}
@Override
public void doKickout(String loginType, Object loginId, String tokenValue) {
System.out.println("踢下线了----------");
// ...
}
@Override
public void doReplaced(String loginType, Object loginId, String tokenValue) {
System.out.println("顶下线了----------");
// ...
}
@Override
public void doDisable(String loginType, Object loginId, long disableTime) {
System.out.println("封号了----------");
// ...
}
@Override
public void doUntieDisable(String loginType, Object loginId) {
System.out.println("解封了----------");
// ...
}
@Override
public void doCreateSession(String id) {
System.out.println("创建session了----------");
// ...
}
@Override
public void doLogoutSession(String id) {
System.out.println("注销session了----------");
// ...
}
}
全局过滤器
多账号认证
定义一个自己的登录工具类:重写里面的方法StpUtil,改变类型即可
再使用上,用StpUserUtil.*,有的加类型
package com.shanghai.test1114.utils;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.fun.SaFunction;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import java.util.List;
public class StpUserUtil {
public static final String TYPE = "user";
public static StpLogic stpLogic = new StpLogic(TYPE);
public static String getLoginType(){
return stpLogic.getLoginType();
}
public static void setStpLogic(StpLogic stpLogic) {
StpUtil.stpLogic = stpLogic;
// 防止自定义 stpLogic 被覆盖
SaManager.putStpLogic(stpLogic);
}
// =================== 获取token 相关 ===================
public static String getTokenName() {
return stpLogic.getTokenName();
}
public static void setTokenValue(String tokenValue){
stpLogic.setTokenValue(tokenValue);
}
public static void setTokenValue(String tokenValue, int cookieTimeout){
stpLogic.setTokenValue(tokenValue, cookieTimeout);
}
public static String getTokenValue() {
return stpLogic.getTokenValue();
}
public static String getTokenValueNotCut(){
return stpLogic.getTokenValueNotCut();
}
public static SaTokenInfo getTokenInfo() {
return stpLogic.getTokenInfo();
}
// =================== 登录相关操作 ===================
// --- 登录
public static void login(Object id) {
stpLogic.login(id);
}
public static void login(Object id, String device) {
stpLogic.login(id, device);
}
public static void login(Object id, boolean isLastingcookie) {
stpLogic.login(id, isLastingcookie);
}
public static void login(Object id, SaLoginModel loginModel) {
stpLogic.login(id, loginModel);
}
// --- 注销
public static void logout() {
stpLogic.logout();
}
public static void logout(Object loginId) {
stpLogic.logout(loginId);
}
public static void logout(Object loginId, String device) {
stpLogic.logout(loginId, device);
}
public static void logoutByTokenValue(String tokenValue) {
stpLogic.logoutByTokenValue(tokenValue);
}
public static void kickout(Object loginId) {
stpLogic.kickout(loginId);
}
public static void kickout(Object loginId, String device) {
stpLogic.kickout(loginId, device);
}
public static void kickoutByTokenValue(String tokenValue) {
stpLogic.kickoutByTokenValue(tokenValue);
}
public static void replaced(Object loginId, String device) {
stpLogic.replaced(loginId, device);
}
// 查询相关
public static boolean isLogin() {
return stpLogic.isLogin();
}
public static void checkLogin() {
stpLogic.checkLogin();
}
public static Object getLoginId() {
return stpLogic.getLoginId();
}
public static T getLoginId(T defaultValue) {
return stpLogic.getLoginId(defaultValue);
}
public static Object getLoginIdDefaultNull() {
return stpLogic.getLoginIdDefaultNull();
}
public static String getLoginIdAsString() {
return stpLogic.getLoginIdAsString();
}
public static int getLoginIdAsInt() {
return stpLogic.getLoginIdAsInt();
}
public static long getLoginIdAsLong() {
return stpLogic.getLoginIdAsLong();
}
public static Object getLoginIdByToken(String tokenValue) {
return stpLogic.getLoginIdByToken(tokenValue);
}
// =================== User-Session 相关 ===================
public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
return stpLogic.getSessionByLoginId(loginId, isCreate);
}
public static SaSession getSessionBySessionId(String sessionId) {
return stpLogic.getSessionBySessionId(sessionId);
}
public static SaSession getSessionByLoginId(Object loginId) {
return stpLogic.getSessionByLoginId(loginId);
}
public static SaSession getSession(boolean isCreate) {
return stpLogic.getSession(isCreate);
}
public static SaSession getSession() {
return stpLogic.getSession();
}
// =================== Token-Session 相关 ===================
public static SaSession getTokenSessionByToken(String tokenValue) {
return stpLogic.getTokenSessionByToken(tokenValue);
}
public static SaSession getTokenSession() {
return stpLogic.getTokenSession();
}
// =================== [临时有效期] 验证相关 ===================
public static void checkActivityTimeout() {
stpLogic.checkActivityTimeout();
}
public static void updateLastActivityToNow() {
stpLogic.updateLastActivityToNow();
}
// =================== 过期时间相关 ===================
public static long getTokenTimeout() {
return stpLogic.getTokenTimeout();
}
public static long getSessionTimeout() {
return stpLogic.getSessionTimeout();
}
public static long getTokenSessionTimeout() {
return stpLogic.getTokenSessionTimeout();
}
public static long getTokenActivityTimeout() {
return stpLogic.getTokenActivityTimeout();
}
// =================== 角色验证操作 ===================
public static List getRoleList() {
return stpLogic.getRoleList();
}
public static List getRoleList(Object loginId) {
return stpLogic.getRoleList(loginId);
}
public static boolean hasRole(String role) {
return stpLogic.hasRole(role);
}
public static boolean hasRole(Object loginId, String role) {
return stpLogic.hasRole(loginId, role);
}
public static boolean hasRoleAnd(String... roleArray){
return stpLogic.hasRoleAnd(roleArray);
}
public static boolean hasRoleOr(String... roleArray){
return stpLogic.hasRoleOr(roleArray);
}
public static void checkRole(String role) {
stpLogic.checkRole(role);
}
public static void checkRoleAnd(String... roleArray){
stpLogic.checkRoleAnd(roleArray);
}
public static void checkRoleOr(String... roleArray){
stpLogic.checkRoleOr(roleArray);
}
// =================== 权限验证操作 ===================
public static List getPermissionList() {
return stpLogic.getPermissionList();
}
public static List getPermissionList(Object loginId) {
return stpLogic.getPermissionList(loginId);
}
public static boolean hasPermission(String permission) {
return stpLogic.hasPermission(permission);
}
public static boolean hasPermission(Object loginId, String permission) {
return stpLogic.hasPermission(loginId, permission);
}
public static boolean hasPermissionAnd(String... permissionArray){
return stpLogic.hasPermissionAnd(permissionArray);
}
public static boolean hasPermissionOr(String... permissionArray){
return stpLogic.hasPermissionOr(permissionArray);
}
public static void checkPermission(String permission) {
stpLogic.checkPermission(permission);
}
public static void checkPermissionAnd(String... permissionArray) {
stpLogic.checkPermissionAnd(permissionArray);
}
public static void checkPermissionOr(String... permissionArray) {
stpLogic.checkPermissionOr(permissionArray);
}
// =================== id 反查token 相关操作 ===================
public static String getTokenValueByLoginId(Object loginId) {
return stpLogic.getTokenValueByLoginId(loginId);
}
public static String getTokenValueByLoginId(Object loginId, String device) {
return stpLogic.getTokenValueByLoginId(loginId, device);
}
public static List getTokenValueListByLoginId(Object loginId) {
return stpLogic.getTokenValueListByLoginId(loginId);
}
public static List getTokenValueListByLoginId(Object loginId, String device) {
return stpLogic.getTokenValueListByLoginId(loginId, device);
}
public static String getLoginDevice() {
return stpLogic.getLoginDevice();
}
// =================== 会话管理 ===================
public static List searchTokenValue(String keyword, int start, int size) {
return stpLogic.searchTokenValue(keyword, start, size);
}
public static List searchSessionId(String keyword, int start, int size) {
return stpLogic.searchSessionId(keyword, start, size);
}
public static List searchTokenSessionId(String keyword, int start, int size) {
return stpLogic.searchTokenSessionId(keyword, start, size);
}
// ------------------- 账号封禁 -------------------
public static void disable(Object loginId, long disableTime) {
stpLogic.disable(loginId, disableTime);
}
public static boolean isDisable(Object loginId) {
return stpLogic.isDisable(loginId);
}
public static long getDisableTime(Object loginId) {
return stpLogic.getDisableTime(loginId);
}
public static void untieDisable(Object loginId) {
stpLogic.untieDisable(loginId);
}
// =================== 身份切换 ===================
public static void switchTo(Object loginId) {
stpLogic.switchTo(loginId);
}
public static void endSwitch() {
stpLogic.endSwitch();
}
public static boolean isSwitch() {
return stpLogic.isSwitch();
}
public static void switchTo(Object loginId, SaFunction function) {
stpLogic.switchTo(loginId, function);
}
// ------------------- 二级认证 -------------------
public static void openSafe(long safeTime) {
stpLogic.openSafe(safeTime);
}
public static boolean isSafe() {
return stpLogic.isSafe();
}
public static void checkSafe() {
stpLogic.checkSafe();
}
public static long getSafeTime() {
return stpLogic.getSafeTime();
}
public static void closeSafe() {
stpLogic.closeSafe();
}
// =================== 历史API,兼容旧版本 ===================
@Deprecated
public static String getLoginKey(){
return stpLogic.getLoginType();
}
@Deprecated
public static void setLoginId(Object loginId) {
stpLogic.login(loginId);
}
@Deprecated
public static void setLoginId(Object loginId, String device) {
stpLogic.login(loginId, device);
}
@Deprecated
public static void setLoginId(Object loginId, boolean isLastingcookie) {
stpLogic.login(loginId, isLastingcookie);
}
@Deprecated
public static void setLoginId(Object loginId, SaLoginModel loginModel) {
stpLogic.login(loginId, loginModel);
}
@Deprecated
public static void logoutByLoginId(Object loginId) {
stpLogic.kickout(loginId);
}
@Deprecated
public static void logoutByLoginId(Object loginId, String device) {
stpLogic.kickout(loginId, device);
}
}
redis业务数据和权限数据分离开
依赖
cn.dev33 sa-token-alone-redis 1.28.0
配置文件
sa-token:
alone-redis:
database: 2
host: 127.0.0.1
port: 6379
password:
timeout: 10
测试代码
// 测试Sa-Token缓存
@GetMapping("/testRedisAlone/login")
@ApiOperation("Token缓存")
public AjaxJson login(@RequestParam(defaultValue = "10001") String id) {
System.out.println("--------------- 测试Sa-Token缓存");
StpUtil.login(id);
return AjaxJson.getSuccess();
}
// 测试业务缓存
@GetMapping("/testRedisAlone/test")
@ApiOperation("测试业务缓存")
public AjaxJson test() {
System.out.println("--------------- 测试业务缓存");
stringRedisTemplate.opsForValue().set("hello", "Hello World");
return AjaxJson.getSuccess();
}
sa-token官网文档



