feat(code): 新增 Cookie 自定义属性支持。fix: #693

This commit is contained in:
click33 2025-01-07 15:40:04 +08:00
parent b59bb39aea
commit 6c4cdf514e
3 changed files with 158 additions and 9 deletions

View File

@ -15,6 +15,9 @@
*/ */
package cn.dev33.satoken.config; package cn.dev33.satoken.config;
import java.util.LinkedHashMap;
import java.util.Map;
/** /**
* Sa-Token Cookie写入 相关配置 * Sa-Token Cookie写入 相关配置
* *
@ -54,6 +57,12 @@ public class SaCookieConfig {
*/ */
private String sameSite; private String sameSite;
/**
* 额外扩展属性
*/
private Map<String, String> extraAttrs = new LinkedHashMap<>();
/** /**
* 获取Cookie 作用域 * 获取Cookie 作用域
* <p> 写入 Cookie 时显式指定的作用域, 常用于单点登录二级域名共享 Cookie 的场景 </p> * <p> 写入 Cookie 时显式指定的作用域, 常用于单点登录二级域名共享 Cookie 的场景 </p>
@ -140,11 +149,69 @@ public class SaCookieConfig {
return this; return this;
} }
/**
* @return 获取额外扩展属性
*/
public Map<String, String> getExtraAttrs() {
return extraAttrs;
}
/**
* 写入额外扩展属性
* @param extraAttrs /
* @return 对象自身
*/
public SaCookieConfig setExtraAttrs(Map<String, String> extraAttrs) {
this.extraAttrs = extraAttrs;
return this;
}
/**
* 追加扩展属性
* @param name /
* @param value /
* @return 对象自身
*/
public SaCookieConfig addExtraAttr(String name, String value) {
if (extraAttrs == null) {
extraAttrs = new LinkedHashMap<>();
}
this.extraAttrs.put(name, value);
return this;
}
/**
* 追加扩展属性
* @param name /
* @return 对象自身
*/
public SaCookieConfig addExtraAttr(String name) {
return this.addExtraAttr(name, null);
}
/**
* 移除指定扩展属性
* @param name /
* @return 对象自身
*/
public SaCookieConfig removeExtraAttr(String name) {
if(extraAttrs != null) {
this.extraAttrs.remove(name);
}
return this;
}
// toString // toString
@Override @Override
public String toString() { public String toString() {
return "SaCookieConfig [domain=" + domain + ", path=" + path + ", secure=" + secure + ", httpOnly=" + httpOnly return "SaCookieConfig [" +
+ ", sameSite=" + sameSite + "]"; "domain=" + domain +
", path=" + path +
", secure=" + secure +
", httpOnly=" + httpOnly +
", sameSite=" + sameSite +
", extraAttrs=" + extraAttrs +
"]";
} }
} }

View File

@ -15,14 +15,16 @@
*/ */
package cn.dev33.satoken.context.model; package cn.dev33.satoken.context.model;
import cn.dev33.satoken.error.SaErrorCode;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.util.SaFoxUtil;
import java.time.Instant; import java.time.Instant;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.LinkedHashMap;
import cn.dev33.satoken.error.SaErrorCode; import java.util.Map;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.util.SaFoxUtil;
/** /**
* Cookie Model代表一个 Cookie 应该具有的所有参数 * Cookie Model代表一个 Cookie 应该具有的所有参数
@ -77,6 +79,13 @@ public class SaCookie {
*/ */
private String sameSite; private String sameSite;
// Cookie 属性参考文章https://blog.csdn.net/fengbin2005/article/details/136544226
/**
* 额外扩展属性
*/
private Map<String, String> extraAttrs = new LinkedHashMap<>();
/** /**
* 构造一个 * 构造一个
@ -224,13 +233,73 @@ public class SaCookie {
return this; return this;
} }
/**
* @return 获取额外扩展属性
*/
public Map<String, String> getExtraAttrs() {
return extraAttrs;
}
/**
* 写入额外扩展属性
* @param extraAttrs /
* @return 对象自身
*/
public SaCookie setExtraAttrs(Map<String, String> extraAttrs) {
this.extraAttrs = extraAttrs;
return this;
}
/**
* 追加扩展属性
* @param name /
* @param value /
* @return 对象自身
*/
public SaCookie addExtraAttr(String name, String value) {
if (extraAttrs == null) {
extraAttrs = new LinkedHashMap<>();
}
this.extraAttrs.put(name, value);
return this;
}
/**
* 追加扩展属性
* @param name /
* @return 对象自身
*/
public SaCookie addExtraAttr(String name) {
return this.addExtraAttr(name, null);
}
/**
* 移除指定扩展属性
* @param name /
* @return 对象自身
*/
public SaCookie removeExtraAttr(String name) {
if(extraAttrs != null) {
this.extraAttrs.remove(name);
}
return this;
}
// toString // toString
@Override @Override
public String toString() { public String toString() {
return "SaCookie [name=" + name + ", value=" + value + ", maxAge=" + maxAge + ", domain=" + domain + ", path=" + path return "SaCookie [" +
+ ", secure=" + secure + ", httpOnly=" + httpOnly + ", sameSite=" "name=" + name +
+ sameSite + "]"; ", value=" + value +
", maxAge=" + maxAge +
", domain=" + domain +
", path=" + path
+ ", secure=" + secure +
", httpOnly=" + httpOnly +
", sameSite=" + sameSite +
", extraAttrs=" + extraAttrs +
"]";
} }
/** /**
@ -256,6 +325,7 @@ public class SaCookie {
throw new SaTokenException("无效Value" + value).setCode(SaErrorCode.CODE_12003); throw new SaTokenException("无效Value" + value).setCode(SaErrorCode.CODE_12003);
} }
// example
// Set-Cookie: name=value; Max-Age=100000; Expires=Tue, 05-Oct-2021 20:28:17 GMT; Domain=localhost; Path=/; Secure; HttpOnly; SameSite=Lax // Set-Cookie: name=value; Max-Age=100000; Expires=Tue, 05-Oct-2021 20:28:17 GMT; Domain=localhost; Path=/; Secure; HttpOnly; SameSite=Lax
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@ -287,6 +357,17 @@ public class SaCookie {
sb.append("; SameSite=").append(sameSite); sb.append("; SameSite=").append(sameSite);
} }
// 扩展属性
if(extraAttrs != null) {
extraAttrs.forEach((k, v) -> {
if(SaFoxUtil.isEmpty(v)) {
sb.append("; ").append(k);
} else {
sb.append("; ").append(k).append("=").append(v);
}
});
}
return sb.toString(); return sb.toString();
} }

View File

@ -248,6 +248,7 @@ public class StpLogic {
.setSecure(cfg.getSecure()) .setSecure(cfg.getSecure())
.setHttpOnly(cfg.getHttpOnly()) .setHttpOnly(cfg.getHttpOnly())
.setSameSite(cfg.getSameSite()) .setSameSite(cfg.getSameSite())
.setExtraAttrs(cfg.getExtraAttrs())
; ;
SaHolder.getResponse().addCookie(cookie); SaHolder.getResponse().addCookie(cookie);
} }