diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java index df9275ea..d29c095e 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java @@ -174,7 +174,7 @@ public class StpLogic { * @param tokenValue token 值 */ public void setTokenValue(String tokenValue){ - setTokenValue(tokenValue, createSaLoginParameter().setTimeout(getConfigOrGlobal().getTimeout())); + setTokenValue(tokenValue, createSaLoginParameter()); } /** @@ -205,7 +205,7 @@ public class StpLogic { // 2. 将 token 写入到当前会话的 Cookie 里 if (getConfigOrGlobal().getIsReadCookie()) { - setTokenValueToCookie(tokenValue, loginParameter.getCookieTimeout()); + setTokenValueToCookie(tokenValue, loginParameter.getCookie(), loginParameter.getCookieTimeout()); } // 3. 将 token 写入到当前请求的响应头中 @@ -244,17 +244,30 @@ public class StpLogic { * @param cookieTimeout Cookie存活时间(单位:秒,填-1代表为内存Cookie,浏览器关闭后消失) */ public void setTokenValueToCookie(String tokenValue, int cookieTimeout){ - SaCookieConfig cfg = getConfigOrGlobal().getCookie(); + setTokenValueToCookie(tokenValue, null, cookieTimeout); + } + + /** + * 将 token 写入到当前会话的 Cookie 里 + * + * @param tokenValue token 值 + * @param cookieConfig Cookie 配置项 + * @param cookieTimeout Cookie存活时间(单位:秒,填-1代表为内存Cookie,浏览器关闭后消失) + */ + public void setTokenValueToCookie(String tokenValue, SaCookieConfig cookieConfig, int cookieTimeout){ + if(cookieConfig == null) { + cookieConfig = getConfigOrGlobal().getCookie(); + } SaCookie cookie = new SaCookie() .setName(getTokenName()) .setValue(tokenValue) .setMaxAge(cookieTimeout) - .setDomain(cfg.getDomain()) - .setPath(cfg.getPath()) - .setSecure(cfg.getSecure()) - .setHttpOnly(cfg.getHttpOnly()) - .setSameSite(cfg.getSameSite()) - .setExtraAttrs(cfg.getExtraAttrs()) + .setDomain(cookieConfig.getDomain()) + .setPath(cookieConfig.getPath()) + .setSecure(cookieConfig.getSecure()) + .setHttpOnly(cookieConfig.getHttpOnly()) + .setSameSite(cookieConfig.getSameSite()) + .setExtraAttrs(cookieConfig.getExtraAttrs()) ; SaHolder.getResponse().addCookie(cookie); } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/SaLoginParameter.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/SaLoginParameter.java index d6688430..ee3c4329 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/SaLoginParameter.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/SaLoginParameter.java @@ -16,8 +16,10 @@ package cn.dev33.satoken.stp.parameter; import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.config.SaCookieConfig; import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.dao.SaTokenDao; +import cn.dev33.satoken.fun.SaParamFunction; import cn.dev33.satoken.stp.parameter.enums.SaLogoutMode; import cn.dev33.satoken.stp.parameter.enums.SaReplacedRange; import cn.dev33.satoken.util.SaTokenConsts; @@ -123,6 +125,11 @@ public class SaLoginParameter { */ private Boolean rightNowCreateTokenSession; + /** + * Cookie 配置对象 + */ + public SaCookieConfig cookie = new SaCookieConfig(); + // ------ 附加方法 @@ -151,6 +158,17 @@ public class SaLoginParameter { this.replacedRange = config.getReplacedRange(); this.overflowLogoutMode = config.getOverflowLogoutMode(); this.rightNowCreateTokenSession = config.getRightNowCreateTokenSession(); + + this.setupCookieConfig(cookie -> { + SaCookieConfig gCookie = config.getCookie(); + cookie.setDomain(gCookie.getDomain()); + cookie.setPath(gCookie.getPath()); + cookie.setSecure(gCookie.getSecure()); + cookie.setHttpOnly(gCookie.getHttpOnly()); + cookie.setSameSite(gCookie.getSameSite()); + cookie.setExtraAttrs(new LinkedHashMap<>(gCookie.getExtraAttrs())); + }); + return this; } @@ -245,6 +263,16 @@ public class SaLoginParameter { return new SaLoginParameter(SaManager.getConfig()); } + /** + * 设置 Cookie 配置项 + * @param fun / + * @return 对象自身 + */ + public SaLoginParameter setupCookieConfig(SaParamFunction fun) { + fun.run(this.cookie); + return this; + } + // ---------------- get set @@ -524,6 +552,22 @@ public class SaLoginParameter { return this; } + /** + * @return Cookie 配置对象 + */ + public SaCookieConfig getCookie() { + return cookie; + } + + /** + * @param cookie Cookie 配置对象 + * @return 对象自身 + */ + public SaLoginParameter setCookie(SaCookieConfig cookie) { + this.cookie = cookie; + return this; + } + /* * toString */ @@ -546,6 +590,7 @@ public class SaLoginParameter { + ", isWriteHeader=" + isWriteHeader + ", terminalTag=" + terminalExtraData + ", rightNowCreateTokenSession=" + rightNowCreateTokenSession + + ", cookie=" + cookie + "]"; } diff --git a/sa-token-doc/up/login-parameter.md b/sa-token-doc/up/login-parameter.md index b122e4f9..0e81be09 100644 --- a/sa-token-doc/up/login-parameter.md +++ b/sa-token-doc/up/login-parameter.md @@ -32,6 +32,14 @@ StpUtil.login(10001, new SaLoginParameter() .setReplacedRange(SaReplacedRange.CURR_DEVICE_TYPE) // 顶人下线的范围: CURR_DEVICE_TYPE=当前指定的设备类型端, ALL_DEVICE_TYPE=所有设备类型端 .setOverflowLogoutMode(SaLogoutMode.LOGOUT) // 溢出 maxLoginCount 的客户端,将以何种方式注销下线: LOGOUT=注销下线, KICKOUT=踢人下线, REPLACED=顶人下线 .setRightNowCreateTokenSession(true) // 是否立即创建对应的 Token-Session (true=在登录时立即创建,false=在第一次调用 getTokenSession() 时创建) + .setupCookieConfig(cookie->{ // 设置 Cookie 配置项 + cookie.setDomain("sa-token.cc"); // 设置:作用域 + cookie.setPath("/shop"); // 设置:路径 (一般只有当你在一个域名下部署多个项目时才会用到此值。) + cookie.setSecure(true); // 设置:是否只在 https 协议下有效 + cookie.setHttpOnly(true); // 设置:是否禁止 js 操作 Cookie + cookie.setSameSite("Lax"); // 设置:第三方限制级别(Strict=完全禁止,Lax=部分允许,None=不限制) + cookie.addExtraAttr("aa", "bb"); // 设置:额外扩展属性 + } ); ```