From 643118177a5c6461d953fea7d48f3044b751af36 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Tue, 5 Oct 2021 23:51:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Cookie=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E7=9A=84secure=E3=80=81httpOnly=E3=80=81sameSite=E7=AD=89?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev33/satoken/config/SaCookieConfig.java | 122 ++++++++ .../dev33/satoken/config/SaTokenConfig.java | 132 ++++----- .../dev33/satoken/context/model/SaCookie.java | 275 ++++++++++++++++++ .../satoken/context/model/SaResponse.java | 28 +- .../java/cn/dev33/satoken/stp/StpLogic.java | 29 +- .../com/pj/satoken/jwt/SaTokenJwtUtil.java | 2 +- .../java/com/pj/satoken/SaTokenConfigure.java | 2 +- .../main/java/com/pj/test/TestController.java | 4 +- .../src/main/resources/application.yml | 2 +- .../reactor/model/SaResponseForReactor.java | 51 +--- .../servlet/model/SaResponseForServlet.java | 40 +-- .../solon/model/SaResponseForSolon.java | 26 +- 12 files changed, 541 insertions(+), 172 deletions(-) create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/config/SaCookieConfig.java create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaCookie.java diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaCookieConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaCookieConfig.java new file mode 100644 index 00000000..8c260f99 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaCookieConfig.java @@ -0,0 +1,122 @@ +package cn.dev33.satoken.config; + +/** + * Sa-Token Cookie写入 相关配置 + * @author kong + * + */ +public class SaCookieConfig { + + /** + * 域(写入Cookie时显式指定的作用域, 常用于单点登录二级域名共享Cookie的场景) + */ + private String domain; + + /** + * 路径 + */ + private String path; + + /** + * 是否只在 https 协议下有效 + */ + private Boolean secure = false; + + /** + * 是否禁止 js 操作 Cookie + */ + private Boolean httpOnly = false; + + /** + * 第三方限制级别(Strict=完全禁止,Lax=部分允许,None=不限制) + */ + private String sameSite; + + /** + * @return 域 (写入Cookie时显式指定的作用域, 常用于单点登录二级域名共享Cookie的场景) + */ + public String getDomain() { + return domain; + } + + /** + * @param domain 域 (写入Cookie时显式指定的作用域, 常用于单点登录二级域名共享Cookie的场景) + * @return 对象自身 + */ + public SaCookieConfig setDomain(String domain) { + this.domain = domain; + return this; + } + + /** + * @return 路径 + */ + public String getPath() { + return path; + } + + /** + * @param path 路径 + * @return 对象自身 + */ + public SaCookieConfig setPath(String path) { + this.path = path; + return this; + } + + /** + * @return 是否只在 https 协议下有效 + */ + public Boolean getSecure() { + return secure; + } + + /** + * @param secure 是否只在 https 协议下有效 + * @return 对象自身 + */ + public SaCookieConfig setSecure(Boolean secure) { + this.secure = secure; + return this; + } + + /** + * @return 是否禁止 js 操作 Cookie + */ + public Boolean getHttpOnly() { + return httpOnly; + } + + /** + * @param httpOnly 是否禁止 js 操作 Cookie + * @return 对象自身 + */ + public SaCookieConfig setHttpOnly(Boolean httpOnly) { + this.httpOnly = httpOnly; + return this; + } + + /** + * @return 第三方限制级别(Strict=完全禁止,Lax=部分允许,None=不限制) + */ + public String getSameSite() { + return sameSite; + } + + /** + * @param sameSite 第三方限制级别(Strict=完全禁止,Lax=部分允许,None=不限制) + * @return 对象自身 + */ + public SaCookieConfig setSameSite(String sameSite) { + this.sameSite = sameSite; + return this; + } + + // toString + @Override + public String toString() { + return "SaCookieConfig [domain=" + domain + ", path=" + path + ", secure=" + secure + ", httpOnly=" + httpOnly + + ", sameSite=" + sameSite + "]"; + } + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java index 3799a192..1983868e 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java @@ -41,12 +41,6 @@ public class SaTokenConfig implements Serializable { /** 是否尝试从cookie里读取token */ private Boolean isReadCookie = true; - /** 使用Cookie时,是否为HttpOnly */ - private Boolean isCookieHttpOnly = false; - - /** 使用Cookie时,是否为Secure */ - private Boolean isCookieSecure = false; - /** token风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) */ private String tokenStyle = "uuid"; @@ -59,9 +53,6 @@ public class SaTokenConfig implements Serializable { /** 是否打开自动续签 (如果此值为true, 框架会在每次直接或间接调用getLoginId()时进行一次过期检查与续签操作) */ private Boolean autoRenew = true; - /** 写入Cookie时显式指定的作用域, 常用于单点登录二级域名共享Cookie的场景 */ - private String cookieDomain; - /** token前缀, 格式样例(satoken: Bearer xxxx-xxxx-xxxx-xxxx) */ private String tokenPrefix; @@ -90,6 +81,11 @@ public class SaTokenConfig implements Serializable { private String currDomain; + /** + * Cookie配置对象 + */ + public SaCookieConfig cookie = new SaCookieConfig(); + /** * SSO单点登录配置对象 */ @@ -226,38 +222,6 @@ public class SaTokenConfig implements Serializable { return this; } - /** - * @return 使用Cookie时,是否为HttpOnly - */ - public Boolean getIsCookieHttpOnly() { - return isCookieHttpOnly; - } - - /** - * @param isCookieHttpOnly 使用Cookie时,是否为HttpOnly - * @return 对象自身 - */ - public SaTokenConfig setIsCookieHttpOnly(Boolean isCookieHttpOnly) { - this.isCookieHttpOnly = isCookieHttpOnly; - return this; - } - - /** - * @return 使用Cookie时,是否为Secure - */ - public Boolean getIsCookieSecure() { - return isCookieSecure; - } - - /** - * @param isCookieSecure 使用Cookie时,是否为Secure - * @return 对象自身 - */ - public SaTokenConfig setIsCookieSecure(Boolean isCookieSecure) { - this.isCookieSecure = isCookieSecure; - return this; - } - /** * @return token风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) */ @@ -324,22 +288,6 @@ public class SaTokenConfig implements Serializable { return this; } - /** - * @return 写入Cookie时显式指定的作用域, 常用于单点登录二级域名共享Cookie的场景 - */ - public String getCookieDomain() { - return cookieDomain; - } - - /** - * @param cookieDomain 写入Cookie时显式指定的作用域, 常用于单点登录二级域名共享Cookie的场景 - * @return 对象自身 - */ - public SaTokenConfig setCookieDomain(String cookieDomain) { - this.cookieDomain = cookieDomain; - return this; - } - /** * @return token前缀, 格式样例(satoken: Bearer xxxx-xxxx-xxxx-xxxx) */ @@ -461,23 +409,54 @@ public class SaTokenConfig implements Serializable { /** * @param sso SSO单点登录配置对象 + * @return 对象自身 */ - public void setSso(SaSsoConfig sso) { + public SaTokenConfig setSso(SaSsoConfig sso) { this.sso = sso; + return this; } + /** + * @return Cookie 全局配置对象 + */ + public SaCookieConfig getCookie() { + return cookie; + } + + /** + * @param cookie Cookie 全局配置对象 + * @return 对象自身 + */ + public SaTokenConfig setCookie(SaCookieConfig cookie) { + this.cookie = cookie; + return this; + } @Override public String toString() { - return "SaTokenConfig [tokenName=" + tokenName + ", timeout=" + timeout + ", activityTimeout=" + activityTimeout - + ", isConcurrent=" + isConcurrent + ", isShare=" + isShare + ", isReadBody=" + isReadBody - + ", isReadHead=" + isReadHead + ", isReadCookie=" + isReadCookie - + ", isCookieHttpOnly=" + isCookieHttpOnly + ", isCookieSecure=" + isCookieSecure + return "SaTokenConfig [" + + "tokenName=" + tokenName + + ", timeout=" + timeout + + ", activityTimeout=" + activityTimeout + + ", isConcurrent=" + isConcurrent + + ", isShare=" + isShare + + ", isReadBody=" + isReadBody + + ", isReadHead=" + isReadHead + + ", isReadCookie=" + isReadCookie + ", tokenStyle=" + tokenStyle - + ", dataRefreshPeriod=" + dataRefreshPeriod + ", tokenSessionCheckLogin=" + tokenSessionCheckLogin - + ", autoRenew=" + autoRenew + ", cookieDomain=" + cookieDomain + ", tokenPrefix=" + tokenPrefix - + ", isPrint=" + isPrint + ", isLog=" + isLog + ", jwtSecretKey=" + jwtSecretKey + ", idTokenTimeout=" - + idTokenTimeout + ", basic=" + basic + ", currDomain=" + currDomain + ", sso=" + sso + "]"; + + ", dataRefreshPeriod=" + dataRefreshPeriod + + ", tokenSessionCheckLogin=" + tokenSessionCheckLogin + + ", autoRenew=" + autoRenew + + ", tokenPrefix=" + tokenPrefix + + ", isPrint=" + isPrint + + ", isLog=" + isLog + + ", jwtSecretKey=" + jwtSecretKey + + ", idTokenTimeout=" + idTokenTimeout + + ", basic=" + basic + + ", currDomain=" + currDomain + + ", sso=" + sso + + ", cookie=" + cookie + + "]"; } @@ -503,4 +482,25 @@ public class SaTokenConfig implements Serializable { return this; } + /** + *

本函数设计已过时,未来版本可能移除此函数,请及时更换为 getCookie().getDomain() ,使用方式保持不变

+ * @return 写入Cookie时显式指定的作用域, 常用于单点登录二级域名共享Cookie的场景 + */ + @Deprecated + public String getCookieDomain() { + return getCookie().getDomain(); + } + + /** + *

本函数设计已过时,未来版本可能移除此函数,请及时更换为 getCookie().setDomain() ,使用方式保持不变

+ * @param cookieDomain 写入Cookie时显式指定的作用域, 常用于单点登录二级域名共享Cookie的场景 + * @return 对象自身 + */ + @Deprecated + public SaTokenConfig setCookieDomain(String cookieDomain) { + this.getCookie().setDomain(cookieDomain); + return this; + } + + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaCookie.java b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaCookie.java new file mode 100644 index 00000000..33893861 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaCookie.java @@ -0,0 +1,275 @@ +package cn.dev33.satoken.context.model; + +import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; + +import cn.dev33.satoken.exception.SaTokenException; +import cn.dev33.satoken.util.SaFoxUtil; + +/** + * Cookie Model + * @author kong + * + */ +public class SaCookie { + + /** + * 写入响应头时使用的key + */ + public static final String HEADER_NAME = "Set-Cookie"; + + /** + * 名称 + */ + private String name; + + /** + * 值 + */ + private String value; + + /** + * 有效时长 (单位:秒),-1代表为临时Cookie 浏览器关闭后自动删除 + */ + private int maxAge = -1; + + /** + * 域 + */ + private String domain; + + /** + * 路径 + */ + private String path; + + /** + * 是否只在 https 协议下有效 + */ + private Boolean secure = false; + + /** + * 是否禁止 js 操作 Cookie + */ + private Boolean httpOnly = false; + + /** + * 第三方限制级别(Strict=完全禁止,Lax=部分允许,None=不限制) + */ + private String sameSite; + + + /** + * 构造一个 + */ + public SaCookie() { + } + + /** + * 构造一个 + * @param name 名字 + * @param value 值 + */ + public SaCookie(String name, String value) { + this.name = name; + this.value = value; + } + + + + /** + * @return 名称 + */ + public String getName() { + return name; + } + + /** + * @param name 名称 + */ + public SaCookie setName(String name) { + this.name = name; + return this; + } + + /** + * @return 值 + */ + public String getValue() { + return value; + } + + /** + * @param value 值 + * @return 对象自身 + */ + public SaCookie setValue(String value) { + this.value = value; + return this; + } + + /** + * @return 有效时长 (单位:秒),-1代表为临时Cookie 浏览器关闭后自动删除 + */ + public int getMaxAge() { + return maxAge; + } + + /** + * @param maxAge 有效时长 (单位:秒),-1代表为临时Cookie 浏览器关闭后自动删除 + * @return 对象自身 + */ + public SaCookie setMaxAge(int maxAge) { + this.maxAge = maxAge; + return this; + } + + /** + * @return 域 + */ + public String getDomain() { + return domain; + } + + /** + * @param domain 域 + * @return 对象自身 + */ + public SaCookie setDomain(String domain) { + this.domain = domain; + return this; + } + + /** + * @return 路径 + */ + public String getPath() { + return path; + } + + /** + * @param path 路径 + * @return 对象自身 + */ + public SaCookie setPath(String path) { + this.path = path; + return this; + } + + /** + * @return 是否只在 https 协议下有效 + */ + public Boolean getSecure() { + return secure; + } + + /** + * @param secure 是否只在 https 协议下有效 + * @return 对象自身 + */ + public SaCookie setSecure(Boolean secure) { + this.secure = secure; + return this; + } + + /** + * @return 是否禁止 js 操作 Cookie + */ + public Boolean getHttpOnly() { + return httpOnly; + } + + /** + * @param httpOnly 是否禁止 js 操作 Cookie + * @return 对象自身 + */ + public SaCookie setHttpOnly(Boolean httpOnly) { + this.httpOnly = httpOnly; + return this; + } + + /** + * @return 第三方限制级别(Strict=完全禁止,Lax=部分允许,None=不限制) + */ + public String getSameSite() { + return sameSite; + } + + /** + * @param sameSite 第三方限制级别(Strict=完全禁止,Lax=部分允许,None=不限制) + * @return 对象自身 + */ + public SaCookie setSameSite(String sameSite) { + this.sameSite = sameSite; + return this; + } + + + // toString + @Override + public String toString() { + return "SaCookie [name=" + name + ", value=" + value + ", maxAge=" + maxAge + ", domain=" + domain + ", path=" + path + + ", secure=" + secure + ", httpOnly=" + httpOnly + ", sameSite=" + + sameSite + "]"; + } + + /** + * 构建一下 + */ + public void builde() { + if(path == null) { + path = "/"; + } + } + + /** + * 转换为响应头 Set-Cookie 参数需要的值 + * @return / + */ + public String toHeaderValue() { + this.builde(); + + if(SaFoxUtil.isEmpty(name)) { + throw new SaTokenException("name不能为空"); + } + if(value != null && value.indexOf(";") > -1) { + throw new SaTokenException("无效Value:" + value); + } + + // Set-Cookie: name=value; Max-Age=100000; Expires=Tue, 05-Oct-2021 20:28:17 GMT; Domain=localhost; Path=/; Secure; HttpOnly; SameSite=Lax + + StringBuffer sb = new StringBuffer(); + sb.append(name + "=" + value); + + if(maxAge >= 0) { + sb.append("; Max-Age=" + maxAge); + String expires; + if(maxAge == 0) { + expires = Instant.EPOCH.atOffset(ZoneOffset.UTC).format(DateTimeFormatter.RFC_1123_DATE_TIME); + } else { + expires = OffsetDateTime.now().plusSeconds(maxAge).format(DateTimeFormatter.RFC_1123_DATE_TIME); + } + sb.append("; Expires=" + expires); + } + if(SaFoxUtil.isEmpty(domain) == false) { + sb.append("; Domain=" + domain); + } + if(SaFoxUtil.isEmpty(path) == false) { + sb.append("; Path=" + path); + } + if(secure) { + sb.append("; Secure"); + } + if(httpOnly) { + sb.append("; HttpOnly"); + } + if(SaFoxUtil.isEmpty(sameSite) == false) { + sb.append("; sameSite=" + sameSite); + } + + return sb.toString(); + } + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java index 3858390e..9718f9e5 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java @@ -17,7 +17,9 @@ public interface SaResponse { * 删除指定Cookie * @param name Cookie名称 */ - public void deleteCookie(String name); + public default void deleteCookie(String name) { + addCookie(name, null, null, null, 0); + } /** * 写入指定Cookie @@ -28,21 +30,17 @@ public interface SaResponse { * @param timeout 过期时间 (秒) */ public default void addCookie(String name, String value, String path, String domain, int timeout) { - this.addCookie(name, value, path, domain, timeout, false, false); + this.addCookie(new SaCookie(name, value).setPath(path).setDomain(domain).setMaxAge(timeout)); } /** * 写入指定Cookie - * @param name Cookie名称 - * @param value Cookie值 - * @param path Cookie路径 - * @param domain Cookie的作用域 - * @param timeout 过期时间 (秒) - * @param isHttpOnly 是否为HttpOnly - * @param isSecure 是否为Secure + * @param cookie Cookie-Model */ - public void addCookie(String name, String value, String path, String domain, int timeout, boolean isHttpOnly, boolean isSecure); - + public default void addCookie(SaCookie cookie) { + this.addHeader(SaCookie.HEADER_NAME, cookie.toHeaderValue()); + } + /** * 设置响应状态码 * @param sc 响应状态码 @@ -57,6 +55,14 @@ public interface SaResponse { * @return 对象自身 */ public SaResponse setHeader(String name, String value); + + /** + * 在响应头里添加一个值 + * @param name 名字 + * @param value 值 + * @return 对象自身 + */ + public SaResponse addHeader(String name, String value); /** * 在响应头写入 [Server] 服务器名称 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 896d5d3f..fa5a5247 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 @@ -12,10 +12,11 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckRole; import cn.dev33.satoken.annotation.SaCheckSafe; import cn.dev33.satoken.annotation.SaMode; +import cn.dev33.satoken.config.SaCookieConfig; import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.context.SaHolder; +import cn.dev33.satoken.context.model.SaCookie; import cn.dev33.satoken.context.model.SaRequest; -import cn.dev33.satoken.context.model.SaResponse; import cn.dev33.satoken.context.model.SaStorage; import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.exception.DisableLoginException; @@ -110,13 +111,31 @@ public class StpLogic { storage.set(splicingKeyJustCreatedSave(), tokenValue); } - // 2. 将token保存到[Cookie]里 + // 2. 将 Token 保存到 [Cookie] 里 if (config.getIsReadCookie()) { - SaResponse response = SaHolder.getResponse(); - response.addCookie(getTokenName(), tokenValue, "/", - config.getCookieDomain(), cookieTimeout, config.getIsCookieHttpOnly(), config.getIsCookieSecure()); + setTokenValueToCookie(tokenValue, cookieTimeout); } } + + /** + * 将 Token 保存到 [Cookie] 里 + * @param tokenValue token值 + * @param cookieTimeout Cookie存活时间(秒) + */ + public void setTokenValueToCookie(String tokenValue, int cookieTimeout){ + SaCookieConfig cfg = getConfig().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()) + ; + SaHolder.getResponse().addCookie(cookie); + } /** * 获取当前TokenValue diff --git a/sa-token-demo/sa-token-demo-jwt/src/main/java/com/pj/satoken/jwt/SaTokenJwtUtil.java b/sa-token-demo/sa-token-demo-jwt/src/main/java/com/pj/satoken/jwt/SaTokenJwtUtil.java index 3c89c650..802cabcf 100644 --- a/sa-token-demo/sa-token-demo-jwt/src/main/java/com/pj/satoken/jwt/SaTokenJwtUtil.java +++ b/sa-token-demo/sa-token-demo-jwt/src/main/java/com/pj/satoken/jwt/SaTokenJwtUtil.java @@ -133,7 +133,7 @@ public class SaTokenJwtUtil { String tokenValue = createTokenValue(loginId); storage.set(splicingKeyJustCreatedSave(), tokenValue); // 将token保存到本次request里 if(config.getIsReadCookie() == true){ // cookie注入 - SaManager.getSaTokenContext().getResponse().addCookie(getTokenName(), tokenValue, "/", config.getCookieDomain(), (int)config.getTimeout()); + SaManager.getSaTokenContext().getResponse().addCookie(getTokenName(), tokenValue, "/", config.getCookie().getDomain(), (int)config.getTimeout()); } } diff --git a/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/satoken/SaTokenConfigure.java b/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/satoken/SaTokenConfigure.java index f15fc2df..8f1551b1 100644 --- a/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/satoken/SaTokenConfigure.java +++ b/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/satoken/SaTokenConfigure.java @@ -37,7 +37,7 @@ public class SaTokenConfigure implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 注册注解拦截器 - registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**").excludePathPatterns(""); + registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**"); } /** diff --git a/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java b/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java index ca017509..565923a4 100644 --- a/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java +++ b/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java @@ -239,7 +239,7 @@ public class TestController { // 测试 浏览器访问: http://localhost:8081/test/test @RequestMapping("test") public AjaxJson test() { - System.out.println("进来了"); + System.out.println("------------进来了"); return AjaxJson.getSuccess(); } @@ -249,6 +249,4 @@ public class TestController { return AjaxJson.getSuccess(); } - - } diff --git a/sa-token-demo/sa-token-demo-springboot/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-springboot/src/main/resources/application.yml index bdc3c641..cb63067a 100644 --- a/sa-token-demo/sa-token-demo-springboot/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-springboot/src/main/resources/application.yml @@ -18,7 +18,7 @@ sa-token: token-style: uuid # 是否输出操作日志 is-log: false - + spring: # redis配置 redis: diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java index 856b58b8..3bd6a28b 100644 --- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java @@ -3,12 +3,9 @@ package cn.dev33.satoken.reactor.model; import java.net.URI; import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseCookie; -import org.springframework.http.ResponseCookie.ResponseCookieBuilder; import org.springframework.http.server.reactive.ServerHttpResponse; import cn.dev33.satoken.context.model.SaResponse; -import cn.dev33.satoken.util.SaFoxUtil; /** * Response for Reactor @@ -38,43 +35,6 @@ public class SaResponseForReactor implements SaResponse { return response; } - /** - * 删除指定Cookie - */ - @Override - public void deleteCookie(String name) { - addCookie(name, null, null, null, 0, false, false); - } - - /** - * 写入指定Cookie - */ - @Override - public void addCookie(String name, String value, String path, String domain, int timeout, boolean isHttpOnly, boolean isSecure) { - // 构建CookieBuilder - ResponseCookieBuilder builder = ResponseCookie.from(name, value) - .domain(domain) - .path(path) - .maxAge(timeout) - .httpOnly(isHttpOnly) - .secure(isSecure) - ; - - // set path - if(SaFoxUtil.isEmpty(path) == true) { - path = "/"; - } - builder.path(path); - - // set domain - if(SaFoxUtil.isEmpty(domain) == false) { - builder.domain(domain); - } - - // 写入Cookie - response.addCookie(builder.build()); - } - /** * 设置响应状态码 */ @@ -93,6 +53,17 @@ public class SaResponseForReactor implements SaResponse { return this; } + /** + * 在响应头里添加一个值 + * @param name 名字 + * @param value 值 + * @return 对象自身 + */ + public SaResponse addHeader(String name, String value) { + response.getHeaders().add(name, value); + return this; + } + /** * 重定向 */ diff --git a/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaResponseForServlet.java b/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaResponseForServlet.java index d123cdc7..88f0d572 100644 --- a/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaResponseForServlet.java +++ b/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaResponseForServlet.java @@ -2,12 +2,10 @@ package cn.dev33.satoken.servlet.model; import java.io.IOException; -import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import cn.dev33.satoken.context.model.SaResponse; import cn.dev33.satoken.exception.SaTokenException; -import cn.dev33.satoken.util.SaFoxUtil; /** * Response for Servlet @@ -37,33 +35,6 @@ public class SaResponseForServlet implements SaResponse { return response; } - /** - * 删除指定Cookie - */ - @Override - public void deleteCookie(String name) { - addCookie(name, null, null, null, 0, false, false); - } - - /** - * 写入指定Cookie - */ - @Override - public void addCookie(String name, String value, String path, String domain, int timeout, boolean isHttpOnly, boolean isSecure) { - Cookie cookie = new Cookie(name, value); - if(SaFoxUtil.isEmpty(path) == true) { - path = "/"; - } - if(SaFoxUtil.isEmpty(domain) == false) { - cookie.setDomain(domain); - } - cookie.setPath(path); - cookie.setMaxAge(timeout); - cookie.setHttpOnly(isHttpOnly); - cookie.setSecure(isSecure); - response.addCookie(cookie); - } - /** * 设置响应状态码 */ @@ -82,6 +53,17 @@ public class SaResponseForServlet implements SaResponse { return this; } + /** + * 在响应头里添加一个值 + * @param name 名字 + * @param value 值 + * @return 对象自身 + */ + public SaResponse addHeader(String name, String value) { + response.addHeader(name, value); + return this; + } + /** * 重定向 */ diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java index 997920fd..a80bba80 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java @@ -1,6 +1,5 @@ package cn.dev33.satoken.solon.model; -import org.noear.solon.Utils; import org.noear.solon.core.handle.Context; import cn.dev33.satoken.context.model.SaResponse; @@ -22,20 +21,6 @@ public class SaResponseForSolon implements SaResponse { return ctx; } - @Override - public void deleteCookie(String s) { - ctx.cookieRemove(s); - } - - @Override - public void addCookie(String name, String value, String path, String domain, int timeout, boolean isHttpOnly, boolean isSecure) { - if (Utils.isNotEmpty(path)) { - path = "/"; - } - - ctx.cookieSet(name, value, domain, path, timeout); - } - @Override public SaResponse setStatus(int sc) { ctx.status(sc); @@ -47,6 +32,17 @@ public class SaResponseForSolon implements SaResponse { ctx.headerSet(name, value); return this; } + + /** + * 在响应头里添加一个值 + * @param name 名字 + * @param value 值 + * @return 对象自身 + */ + public SaResponse addHeader(String name, String value) { + ctx.headerAdd(name, value); + return this; + } @Override public Object redirect(String url) {