在无token时自动创建会话,完美兼容token-session会话模型!

This commit is contained in:
shengzhang
2020-12-28 00:40:35 +08:00
parent 930c28df6d
commit d3792ad286
4 changed files with 47 additions and 8 deletions

View File

@@ -1,6 +1,7 @@
package cn.dev33.satoken.stp; package cn.dev33.satoken.stp;
import java.util.List; import java.util.List;
import java.util.Objects;
import javax.servlet.http.Cookie; import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -428,7 +429,18 @@ public class StpLogic {
return getSession(true); return getSession(true);
} }
// ---------- token专属session
// =================== token专属session ===================
/**
* 获取指定token的专属session如果session尚未创建isCreate代表是否新建并返回
* @param tokenValue token值
* @param isCreate 是否新建
* @return session会话
*/
public SaSession getTokenSessionByToken(String tokenValue, boolean isCreate) {
return getSessionBySessionId(getKeyTokenSession(tokenValue), isCreate);
}
/** /**
* 获取指定token的专属session如果session尚未创建则新建并返回 * 获取指定token的专属session如果session尚未创建则新建并返回
@@ -439,16 +451,34 @@ public class StpLogic {
return getSessionBySessionId(getKeyTokenSession(tokenValue), true); return getSessionBySessionId(getKeyTokenSession(tokenValue), true);
} }
/**
* 获取当前token的专属-session如果session尚未创建isCreate代表是否新建并返回
* <p> 只有当前会话属于登录状态才可调用
* @param isCreate 是否新建
* @return session会话
*/
public SaSession getTokenSession(boolean isCreate) {
// 如果配置了需要校验登录状态,则验证一下
if(getConfig().getTokenSessionCheckLogin()) {
checkLogin();
} else {
// 如果配置忽略token登录校验则必须保证token不为null (token为null的时候随机创建一个)
String tokenValue = getTokenValue();
if(tokenValue == null || Objects.equals(tokenValue, "")) {
setLoginId(SaTokenInsideUtil.getMarking28());
}
}
// 返回这个token对应的专属session
return getSessionBySessionId(getKeyTokenSession(getTokenValue()), isCreate);
}
/** /**
* 获取当前token的专属-session如果session尚未创建则新建并返回 * 获取当前token的专属-session如果session尚未创建则新建并返回
* <p> 只有当前会话属于登录状态才可调用 * <p> 只有当前会话属于登录状态才可调用
* @return session会话 * @return session会话
*/ */
public SaSession getTokenSession() { public SaSession getTokenSession() {
if(getConfig().getTokenSessionCheckLogin()) { return getTokenSession(true);
checkLogin();
}
return getTokenSessionByToken(getTokenValue());
} }
@@ -758,7 +788,7 @@ public class StpLogic {
* 返回配置对象 * 返回配置对象
*/ */
public SaTokenConfig getConfig() { public SaTokenConfig getConfig() {
// 为什么再代理一层? 为某些极端业务场景下[需要不同StpLogic不同配置]提供便利 // 为什么再代理一层? 为某些极端业务场景下[需要不同StpLogic不同配置]提供便利
return SaTokenManager.getConfig(); return SaTokenManager.getConfig();
} }

View File

@@ -207,7 +207,8 @@ public class StpUtil {
return stpLogic.getSession(); return stpLogic.getSession();
} }
// ---------- token专属session
// =================== token专属session ===================
/** /**
* 获取指定token的专属session如果session尚未创建则新建并返回 * 获取指定token的专属session如果session尚未创建则新建并返回

View File

@@ -59,5 +59,12 @@ public class SaTokenInsideUtil {
return sb.toString(); return sb.toString();
} }
/**
* 以当前时间戳和随机int数字拼接一个随机字符串
*/
public static String getMarking28() {
return System.currentTimeMillis() + "" + new Random().nextInt(Integer.MAX_VALUE);
}
} }

View File

@@ -23,6 +23,7 @@ spring:
token-style: uuid token-style: uuid
# 是否在初始化配置时打印版本字符画 # 是否在初始化配置时打印版本字符画
is-v: true is-v: true
tokenSessionCheckLogin: false
# redis配置 # redis配置