在无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;
import java.util.List;
import java.util.Objects;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
@@ -428,7 +429,18 @@ public class StpLogic {
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尚未创建则新建并返回
@@ -438,6 +450,27 @@ public class StpLogic {
public SaSession getTokenSessionByToken(String tokenValue) {
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尚未创建则新建并返回
@@ -445,10 +478,7 @@ public class StpLogic {
* @return session会话
*/
public SaSession getTokenSession() {
if(getConfig().getTokenSessionCheckLogin()) {
checkLogin();
}
return getTokenSessionByToken(getTokenValue());
return getTokenSession(true);
}
@@ -755,10 +785,10 @@ public class StpLogic {
}
/**
* 返回配置对象
* 返回配置对象
*/
public SaTokenConfig getConfig() {
// 为什么再代理一层? 为某些极端业务场景下[需要不同StpLogic不同配置]提供便利
// 为什么再代理一层? 为某些极端业务场景下[需要不同StpLogic不同配置]提供便利
return SaTokenManager.getConfig();
}

View File

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

View File

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