fun) {
- try {
- setContext(exchange);
- return fun.run();
- } finally {
- clearContext();
- }
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java
deleted file mode 100644
index ac5e5e9e..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.filter;
-
-import cn.dev33.satoken.exception.BackResultException;
-import cn.dev33.satoken.exception.SaTokenException;
-import cn.dev33.satoken.exception.StopMatchException;
-import cn.dev33.satoken.filter.SaFilter;
-import cn.dev33.satoken.filter.SaFilterAuthStrategy;
-import cn.dev33.satoken.filter.SaFilterErrorStrategy;
-import cn.dev33.satoken.reactor.context.SaReactorSyncHolder;
-import cn.dev33.satoken.reactor.util.SaReactorOperateUtil;
-import cn.dev33.satoken.router.SaRouter;
-import cn.dev33.satoken.util.SaTokenConsts;
-import org.springframework.core.annotation.Order;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilter;
-import org.springframework.web.server.WebFilterChain;
-import reactor.core.publisher.Mono;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 全局鉴权过滤器 (基于 Reactor)
- *
- * 默认优先级为 -100,尽量保证在其它过滤器之前执行
- *
- *
- * @author click33
- * @since 1.19.0
- */
-@Order(SaTokenConsts.ASSEMBLY_ORDER)
-public class SaReactorFilter implements SaFilter, WebFilter {
-
- /*
- * 三种 Filter :
- * WebFilter: Spring WebFlux 的过滤器,用于拦截 Web 请求
- * GlobalFilter: Spring Cloud Gateway 的全局过滤器,用于拦截 Gateway 请求
- * GatewayFilter: Spring Cloud Gateway 的局部过滤器,用于拦截 Gateway 请求
- */
-
- // ------------------------ 设置此过滤器 拦截 & 放行 的路由
-
- /**
- * 拦截路由
- */
- public List includeList = new ArrayList<>();
-
- /**
- * 放行路由
- */
- public List excludeList = new ArrayList<>();
-
- @Override
- public SaReactorFilter addInclude(String... paths) {
- includeList.addAll(Arrays.asList(paths));
- return this;
- }
-
- @Override
- public SaReactorFilter addExclude(String... paths) {
- excludeList.addAll(Arrays.asList(paths));
- return this;
- }
-
- @Override
- public SaReactorFilter setIncludeList(List pathList) {
- includeList = pathList;
- return this;
- }
-
- @Override
- public SaReactorFilter setExcludeList(List pathList) {
- excludeList = pathList;
- return this;
- }
-
-
- // ------------------------ 钩子函数
-
- /**
- * 认证函数:每次请求执行
- */
- public SaFilterAuthStrategy auth = r -> {};
-
- /**
- * 异常处理函数:每次[认证函数]发生异常时执行此函数
- */
- public SaFilterErrorStrategy error = e -> {
- throw new SaTokenException(e);
- };
-
- /**
- * 前置函数:在每次[认证函数]之前执行
- * 注意点:前置认证函数将不受 includeList 与 excludeList 的限制,所有路由的请求都会进入 beforeAuth
- */
- public SaFilterAuthStrategy beforeAuth = r -> {};
-
- @Override
- public SaReactorFilter setAuth(SaFilterAuthStrategy auth) {
- this.auth = auth;
- return this;
- }
-
- @Override
- public SaReactorFilter setError(SaFilterErrorStrategy error) {
- this.error = error;
- return this;
- }
-
- @Override
- public SaReactorFilter setBeforeAuth(SaFilterAuthStrategy beforeAuth) {
- this.beforeAuth = beforeAuth;
- return this;
- }
-
-
- // ------------------------ filter
-
- @Override
- public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
-
- // ---------- 全局认证处理
- try {
- SaReactorSyncHolder.setContext(exchange);
- beforeAuth.run(null);
- SaRouter.match(includeList).notMatch(excludeList).check(r -> auth.run(null));
- }
- catch (StopMatchException ignored) {}
- catch (BackResultException e) {
- return SaReactorOperateUtil.writeResult(exchange, e.getMessage());
- }
- catch (Throwable e) {
- return SaReactorOperateUtil.writeResult(exchange, String.valueOf(error.run(e)));
- }
- finally {
- SaReactorSyncHolder.clearContext();
- }
-
- return chain.filter(exchange);
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenContextFilterForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenContextFilterForReactor.java
deleted file mode 100644
index 7fb415bb..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenContextFilterForReactor.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.filter;
-
-import cn.dev33.satoken.reactor.context.SaReactorHolder;
-import cn.dev33.satoken.util.SaTokenConsts;
-import org.springframework.core.annotation.Order;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilter;
-import org.springframework.web.server.WebFilterChain;
-import reactor.core.publisher.Mono;
-
-/**
- * SaTokenContext 上下文初始化过滤器 (基于 Reactor)
- *
- * @author click33
- * @since 1.42.0
- */
-@Order(SaTokenConsts.SA_TOKEN_CONTEXT_FILTER_ORDER)
-public class SaTokenContextFilterForReactor implements WebFilter {
-
- @Override
- public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
- return chain.filter(exchange)
- .contextWrite(ctx -> SaReactorHolder.setContext(ctx, exchange, chain))
- .doFinally(r -> {
- // 在流式上下文中保存的数据会随着流式操作的结束而销毁,所以此处无需手动清除数据
- });
- }
-
-}
-
-
- /*
- * 这种写法有问题:
- @Override
- public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
- try {
- SaReactorSyncHolder.setContext(exchange);
- return chain.filter(exchange);
- } finally {
- SaReactorSyncHolder.clearContext();
- }
- }
- 这种写法会先执行 finally,然后进入具体的 Controller
- */
diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java
deleted file mode 100644
index bc1a3558..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.model;
-
-
-import cn.dev33.satoken.SaManager;
-import cn.dev33.satoken.application.ApplicationInfo;
-import cn.dev33.satoken.context.model.SaRequest;
-import cn.dev33.satoken.reactor.context.SaReactorHolder;
-import cn.dev33.satoken.reactor.context.SaReactorSyncHolder;
-import cn.dev33.satoken.util.SaFoxUtil;
-import org.springframework.http.HttpCookie;
-import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilterChain;
-
-import java.util.Collection;
-import java.util.Map;
-
-/**
- * 对 SaRequest 包装类的实现(Reactor 响应式编程版)
- *
- * @author click33
- * @since 1.19.0
- */
-public class SaRequestForReactor implements SaRequest {
-
- /**
- * 底层Request对象
- */
- protected ServerHttpRequest request;
-
- /**
- * 实例化
- * @param request request对象
- */
- public SaRequestForReactor(ServerHttpRequest request) {
- this.request = request;
- }
-
- /**
- * 获取底层源对象
- */
- @Override
- public Object getSource() {
- return request;
- }
-
- /**
- * 在 [请求体] 里获取一个值
- */
- @Override
- public String getParam(String name) {
- return request.getQueryParams().getFirst(name);
- }
-
- /**
- * 获取 [请求体] 里提交的所有参数名称
- * @return 参数名称列表
- */
- @Override
- public Collection getParamNames(){
- return request.getQueryParams().keySet();
- }
-
- /**
- * 获取 [请求体] 里提交的所有参数
- * @return 参数列表
- */
- @Override
- public Map getParamMap(){
- return request.getQueryParams().toSingleValueMap();
- }
-
- /**
- * 在 [请求头] 里获取一个值
- */
- @Override
- public String getHeader(String name) {
- return request.getHeaders().getFirst(name);
- }
-
- /**
- * 在 [Cookie作用域] 里获取一个值
- */
- @Override
- public String getCookieValue(String name) {
- return getCookieLastValue(name);
- }
-
- /**
- * 在 [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
- */
- @Override
- public String getCookieFirstValue(String name){
- HttpCookie cookie = request.getCookies().getFirst(name);
- if(cookie == null) {
- return null;
- }
- return cookie.getValue();
- }
-
- /**
- * 在 [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
- * @param name 键
- * @return 值
- */
- @Override
- public String getCookieLastValue(String name){
- String value = null;
- String cookieStr = getHeader("Cookie");
- if(SaFoxUtil.isNotEmpty(cookieStr)) {
- String[] cookieItems = cookieStr.split(";");
- for (String item : cookieItems) {
- String[] kv = item.split("=");
- if (kv.length == 2) {
- if (kv[0].trim().equals(name)) {
- value = kv[1].trim();
- }
- }
- }
- }
- return value;
-
- // 此种写法无法获取到最后一个 Cookie,WebFlux 底层代码应该是有bug,前端提交多个同名Cookie时只能解析出第一个来
-// List cookies = request.getCookies().get(name);
-// if(cookies.isEmpty()) {
-// return null;
-// }
-// return cookies.get(cookies.size() - 1).getValue();
- }
-
- /**
- * 返回当前请求path (不包括上下文名称)
- */
- @Override
- public String getRequestPath() {
- return ApplicationInfo.cutPathPrefix(request.getPath().toString());
- }
-
- /**
- * 返回当前请求的url,例:http://xxx.com/test
- * @return see note
- */
- public String getUrl() {
- String currDomain = SaManager.getConfig().getCurrDomain();
- if( ! SaFoxUtil.isEmpty(currDomain)) {
- return currDomain + this.getRequestPath();
- }
- return request.getURI().toString();
- }
-
- /**
- * 返回当前请求的类型
- */
- @Override
- public String getMethod() {
- return request.getMethod().name();
- }
-
- /**
- * 查询请求 host
- */
- @Override
- public String getHost() {
- return request.getURI().getHost();
- }
-
- /**
- * 转发请求
- */
- @Override
- public Object forward(String path) {
- ServerWebExchange exchange = SaReactorSyncHolder.getExchange();
- WebFilterChain chain = exchange.getAttribute(SaReactorHolder.CHAIN_KEY);
-
- ServerHttpRequest newRequest = request.mutate().path(path).build();
- ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
-
- return chain.filter(newExchange);
- }
-
-}
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
deleted file mode 100644
index f2d8ce9f..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.model;
-
-import java.net.URI;
-
-import org.springframework.http.HttpStatus;
-import org.springframework.http.server.reactive.ServerHttpResponse;
-
-import cn.dev33.satoken.context.model.SaResponse;
-
-/**
- * 对 SaResponse 包装类的实现(Reactor 响应式编程版)
- *
- * @author click33
- * @since 1.19.0
- */
-public class SaResponseForReactor implements SaResponse {
-
- /**
- * 底层Response对象
- */
- protected ServerHttpResponse response;
-
- /**
- * 实例化
- * @param response response对象
- */
- public SaResponseForReactor(ServerHttpResponse response) {
- this.response = response;
- }
-
- /**
- * 获取底层源对象
- */
- @Override
- public Object getSource() {
- return response;
- }
-
- /**
- * 设置响应状态码
- */
- @Override
- public SaResponse setStatus(int sc) {
- response.setStatusCode(HttpStatus.valueOf(sc));
- return this;
- }
-
- /**
- * 在响应头里写入一个值
- */
- @Override
- public SaResponse setHeader(String name, String value) {
- response.getHeaders().set(name, value);
- return this;
- }
-
- /**
- * 在响应头里添加一个值
- * @param name 名字
- * @param value 值
- * @return 对象自身
- */
- public SaResponse addHeader(String name, String value) {
- response.getHeaders().add(name, value);
- return this;
- }
-
- /**
- * 重定向
- */
- @Override
- public Object redirect(String url) {
- response.setStatusCode(HttpStatus.FOUND);
- response.getHeaders().setLocation(URI.create(url));
- return null;
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaStorageForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaStorageForReactor.java
deleted file mode 100644
index 0c338123..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaStorageForReactor.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.model;
-
-import org.springframework.web.server.ServerWebExchange;
-
-import cn.dev33.satoken.context.model.SaStorage;
-
-/**
- * 对 SaStorage 包装类的实现(Reactor 响应式编程版)
- *
- * @author click33
- * @since 1.19.0
- */
-public class SaStorageForReactor implements SaStorage {
-
- /**
- * 底层 ServerWebExchange 对象
- */
- protected ServerWebExchange exchange;
-
- /**
- * 实例化
- * @param exchange exchange对象
- */
- public SaStorageForReactor(ServerWebExchange exchange) {
- this.exchange = exchange;
- }
-
- /**
- * 获取底层源对象
- */
- @Override
- public Object getSource() {
- return exchange;
- }
-
- /**
- * 在 [Request作用域] 里写入一个值
- */
- @Override
- public SaStorageForReactor set(String key, Object value) {
- exchange.getAttributes().put(key, value);
- return this;
- }
-
- /**
- * 在 [Request作用域] 里获取一个值
- */
- @Override
- public Object get(String key) {
- return exchange.getAttributes().get(key);
- }
-
- /**
- * 在 [Request作用域] 里删除一个值
- */
- @Override
- public SaStorageForReactor delete(String key) {
- exchange.getAttributes().remove(key);
- return this;
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/package-info.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/package-info.java
index df78335d..6d25953e 100644
--- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/package-info.java
+++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/package-info.java
@@ -13,7 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
/**
- * Sa-Token 集成 Reactor 响应式编程的各个组件
+ * Sa-Token 集成 Reactor 响应式编程 (SpringBoot 2.x)
*/
-package cn.dev33.satoken.reactor;
\ No newline at end of file
+package cn.dev33.satoken.reactor;
diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java
deleted file mode 100644
index 46de9bcb..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.spring;
-
-import cn.dev33.satoken.context.SaTokenContextForThreadLocal;
-
-/**
- * 此为低版本(<1.42.0) 的上下文处理方案,仅做留档,如无必要请勿使用
- *
- * Sa-Token 上下文处理器 [ Spring Reactor 版本实现 ] ,基于 SaTokenContextForThreadLocal 定制
- *
- * @author click33
- * @since 1.33.0
- */
-public class SaTokenContextForSpringReactor extends SaTokenContextForThreadLocal {
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SpringBootVersionCompatibilityChecker.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SpringBootVersionCompatibilityChecker.java
index 8afcf09a..c8453a0a 100644
--- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SpringBootVersionCompatibilityChecker.java
+++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SpringBootVersionCompatibilityChecker.java
@@ -5,7 +5,7 @@ import cn.dev33.satoken.util.SaFoxUtil;
import org.springframework.boot.SpringBootVersion;
/**
- * SpringBoot 版本与 Sa-Token 版本兼容检查器,当开发者错误的在 SpringBoot3.x 项目中引入当前集成包时,将在控制台做出提醒并阻断项目启动
+ * SpringBoot 版本与 Sa-Token 版本兼容检查器,当开发者错误的在 SpringBoot3/4.x 项目中引入当前集成包时,将在控制台做出提醒并阻断项目启动
*
* @author Uncarbon
* @since 1.38.0
@@ -18,7 +18,7 @@ public class SpringBootVersionCompatibilityChecker {
return;
}
String str = "当前 SpringBoot 版本(" + version + ")与 Sa-Token 依赖不兼容," +
- "请将依赖 sa-token-reactor-spring-boot-starter 修改为:sa-token-reactor-spring-boot3-starter";
+ "请将依赖 sa-token-reactor-spring-boot-starter 修改为:sa-token-reactor-spring-boot3/4-starter";
System.err.println(str);
throw new SaTokenException(str);
}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/pom.xml b/sa-token-starter/sa-token-reactor-spring-boot3-starter/pom.xml
index f517c9fc..ce8c5f82 100644
--- a/sa-token-starter/sa-token-reactor-spring-boot3-starter/pom.xml
+++ b/sa-token-starter/sa-token-reactor-spring-boot3-starter/pom.xml
@@ -16,49 +16,12 @@
sa-token-reactor-spring-boot3-starter
springboot3 reactor integrate sa-token
-
- 3.0.1
-
-
-
-
- org.springframework.boot
- spring-boot-starter
- true
-
-
-
-
- org.springframework
- spring-web
- true
-
-
-
-
- io.projectreactor
- reactor-core
-
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- true
-
-
-
-
- org.springframework.boot
- spring-boot-configuration-processor
- true
-
-
+
cn.dev33
- sa-token-spring-boot-webmvc-reactor-v2v3v4-common
+ sa-token-spring-boot-reactor-v2v3v4-common
@@ -71,27 +34,16 @@
-
-
-
- org.springframework.boot
- spring-boot-starter
- ${springboot3.version}
-
-
-
- org.springframework
- spring-web
- 6.2.5
-
-
+
- org.springframework.boot
- spring-boot-configuration-processor
- ${springboot3.version}
+ cn.dev33
+ sa-token-spring-boot3-dependencies
+ ${revision}
+ pom
+ import
-
+
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaFirewallCheckFilterForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaFirewallCheckFilterForReactor.java
deleted file mode 100644
index da6d6859..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaFirewallCheckFilterForReactor.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.filter;
-
-import cn.dev33.satoken.exception.BackResultException;
-import cn.dev33.satoken.exception.FirewallCheckException;
-import cn.dev33.satoken.exception.StopMatchException;
-import cn.dev33.satoken.reactor.context.SaReactorSyncHolder;
-import cn.dev33.satoken.reactor.model.SaRequestForReactor;
-import cn.dev33.satoken.reactor.model.SaResponseForReactor;
-import cn.dev33.satoken.reactor.util.SaReactorOperateUtil;
-import cn.dev33.satoken.strategy.SaFirewallStrategy;
-import cn.dev33.satoken.util.SaTokenConsts;
-import org.springframework.core.annotation.Order;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilter;
-import org.springframework.web.server.WebFilterChain;
-import reactor.core.publisher.Mono;
-
-/**
- * 防火墙校验过滤器 (Reactor版)
- *
- * @author click33
- * @since 1.37.0
- */
-@Order(SaTokenConsts.FIREWALL_CHECK_FILTER_ORDER)
-public class SaFirewallCheckFilterForReactor implements WebFilter {
-
- @Override
- public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
-
- SaRequestForReactor saRequest = new SaRequestForReactor(exchange.getRequest());
- SaResponseForReactor saResponse = new SaResponseForReactor(exchange.getResponse());
-
- try {
- SaReactorSyncHolder.setContext(exchange);
- SaFirewallStrategy.instance.check.execute(saRequest, saResponse, exchange);
- }
- catch (StopMatchException ignored) {}
- catch (BackResultException e) {
- return SaReactorOperateUtil.writeResult(exchange, e.getMessage());
- }
- // FirewallCheckException 异常则交由异常处理策略处理
- catch (FirewallCheckException e) {
- if(SaFirewallStrategy.instance.checkFailHandle == null) {
- return SaReactorOperateUtil.writeResult(exchange, e.getMessage());
- } else {
- SaFirewallStrategy.instance.checkFailHandle.run(e, saRequest, saResponse, null);
- return Mono.empty();
- }
- }
- finally {
- SaReactorSyncHolder.clearContext();
- }
- // 更多异常则不处理,交由 Web 框架处理
-
- // 向下执行
- return chain.filter(exchange);
- }
-
-}
\ No newline at end of file
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenContextFilterForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenContextFilterForReactor.java
deleted file mode 100644
index 27936837..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenContextFilterForReactor.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.filter;
-
-import cn.dev33.satoken.reactor.context.SaReactorHolder;
-import cn.dev33.satoken.util.SaTokenConsts;
-import org.springframework.core.annotation.Order;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilter;
-import org.springframework.web.server.WebFilterChain;
-import reactor.core.publisher.Mono;
-
-/**
- * SaTokenContext 上下文初始化过滤器 (基于 Reactor)
- *
- * @author click33
- * @since 1.42.0
- */
-@Order(SaTokenConsts.SA_TOKEN_CONTEXT_FILTER_ORDER)
-public class SaTokenContextFilterForReactor implements WebFilter {
-
- @Override
- public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
- return chain.filter(exchange)
- .contextWrite(ctx -> SaReactorHolder.setContext(ctx, exchange, chain))
- .doFinally(r -> {
- // 在流式上下文中保存的数据会随着流式操作的结束而销毁,所以此处无需手动清除数据
- });
- }
-
-}
\ No newline at end of file
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenCorsFilterForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenCorsFilterForReactor.java
deleted file mode 100644
index 65a2b985..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenCorsFilterForReactor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.filter;
-
-import cn.dev33.satoken.context.SaHolder;
-import cn.dev33.satoken.context.model.SaTokenContextModelBox;
-import cn.dev33.satoken.exception.BackResultException;
-import cn.dev33.satoken.exception.StopMatchException;
-import cn.dev33.satoken.reactor.context.SaReactorSyncHolder;
-import cn.dev33.satoken.reactor.util.SaReactorOperateUtil;
-import cn.dev33.satoken.strategy.SaStrategy;
-import cn.dev33.satoken.util.SaTokenConsts;
-import org.springframework.core.annotation.Order;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilter;
-import org.springframework.web.server.WebFilterChain;
-import reactor.core.publisher.Mono;
-
-/**
- * CORS 跨域策略过滤器 (基于 Reactor)
- *
- * @author click33
- * @since 1.42.0
- */
-@Order(SaTokenConsts.CORS_FILTER_ORDER)
-public class SaTokenCorsFilterForReactor implements WebFilter {
-
- @Override
- public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
-
- try {
- SaReactorSyncHolder.setContext(exchange);
- SaTokenContextModelBox box = SaHolder.getContext().getModelBox();
- SaStrategy.instance.corsHandle.execute(box.getRequest(), box.getResponse(), box.getStorage());
- }
- catch (StopMatchException ignored) {}
- catch (BackResultException e) {
- return SaReactorOperateUtil.writeResult(exchange, e.getMessage());
- }
- finally {
- SaReactorSyncHolder.clearContext();
- }
-
- return chain.filter(exchange);
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/package-info.java b/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/package-info.java
index df78335d..3888dc13 100644
--- a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/package-info.java
+++ b/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/package-info.java
@@ -13,7 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
/**
- * Sa-Token 集成 Reactor 响应式编程的各个组件
+ * Sa-Token 集成 Reactor 响应式编程 (SpringBoot 3.x)
*/
-package cn.dev33.satoken.reactor;
\ No newline at end of file
+package cn.dev33.satoken.reactor;
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextRegister.java b/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextRegister.java
deleted file mode 100644
index 559be296..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextRegister.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.spring;
-
-import cn.dev33.satoken.reactor.filter.SaFirewallCheckFilterForReactor;
-import cn.dev33.satoken.reactor.filter.SaTokenContextFilterForReactor;
-import cn.dev33.satoken.reactor.filter.SaTokenCorsFilterForReactor;
-import cn.dev33.satoken.spring.pathmatch.SaPathPatternParserUtil;
-import cn.dev33.satoken.strategy.SaStrategy;
-import org.springframework.context.annotation.Bean;
-
-/**
- * 注册 Sa-Token 所需要的 Bean
- *
- * @author click33
- * @since 1.34.0
- */
-public class SaTokenContextRegister {
-
- public SaTokenContextRegister() {
- // 重写路由匹配算法
- SaStrategy.instance.routeMatcher = (pattern, path) -> {
- return SaPathPatternParserUtil.match(pattern, path);
- };
- }
-
- /**
- * 上下文过滤器
- *
- * @return /
- */
- @Bean
- public SaTokenContextFilterForReactor saTokenContextFilterForServlet() {
- return new SaTokenContextFilterForReactor();
- }
-
- /**
- * CORS 跨域策略过滤器
- *
- * @return /
- */
- @Bean
- public SaTokenCorsFilterForReactor saTokenCorsFilterForReactor() {
- return new SaTokenCorsFilterForReactor();
- }
-
- /**
- * 防火墙过滤器
- *
- * @return /
- */
- @Bean
- public SaFirewallCheckFilterForReactor saFirewallCheckFilterForReactor() {
- return new SaFirewallCheckFilterForReactor();
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/util/SaReactorOperateUtil.java b/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/util/SaReactorOperateUtil.java
deleted file mode 100644
index 706501bf..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/util/SaReactorOperateUtil.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.util;
-
-import cn.dev33.satoken.util.SaTokenConsts;
-import org.springframework.web.server.ServerWebExchange;
-import reactor.core.publisher.Mono;
-
-/**
- * Reactor 操作工具类
- *
- * @author click33
- * @since 1.42.0
- */
-public class SaReactorOperateUtil {
-
- /**
- * 写入结果到输出流
- * @param exchange /
- * @param result /
- * @return /
- */
- public static Mono writeResult(ServerWebExchange exchange, String result) {
- // 写入输出流
- // 请注意此处默认 Content-Type 为 text/plain,如果需要返回 JSON 信息,需要在 return 前自行设置 Content-Type 为 application/json
- // 例如:SaHolder.getResponse().setHeader("Content-Type", "application/json;charset=UTF-8");
- if(exchange.getResponse().getHeaders().getFirst(SaTokenConsts.CONTENT_TYPE_KEY) == null) {
- exchange.getResponse().getHeaders().set(SaTokenConsts.CONTENT_TYPE_KEY, SaTokenConsts.CONTENT_TYPE_TEXT_PLAIN);
- }
- return exchange.getResponse().writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(result.getBytes())));
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/pom.xml b/sa-token-starter/sa-token-reactor-spring-boot4-starter/pom.xml
index 27e56f42..08206302 100644
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/pom.xml
+++ b/sa-token-starter/sa-token-reactor-spring-boot4-starter/pom.xml
@@ -17,44 +17,11 @@
springboot4 reactor integrate sa-token
-
-
- org.springframework.boot
- spring-boot-starter
- true
-
-
-
-
- org.springframework
- spring-web
- true
-
-
-
-
- io.projectreactor
- reactor-core
-
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- true
-
-
-
-
- org.springframework.boot
- spring-boot-configuration-processor
- true
-
-
+
cn.dev33
- sa-token-spring-boot-webmvc-reactor-v2v3v4-common
+ sa-token-spring-boot-reactor-v2v3v4-common
@@ -67,6 +34,7 @@
+
cn.dev33
@@ -75,6 +43,7 @@
pom
import
+
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorHolder.java b/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorHolder.java
deleted file mode 100644
index 6f81609c..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorHolder.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.context;
-
-import cn.dev33.satoken.fun.SaRetGenericFunction;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilterChain;
-import reactor.core.publisher.Mono;
-import reactor.util.context.Context;
-import reactor.util.context.ContextView;
-
-/**
- * Reactor 上下文操作(异步),持有当前请求的 ServerWebExchange 全局引用
- *
- * @author click33
- * @since 1.19.0
- */
-public class SaReactorHolder {
-
- /**
- * ServerWebExchange key
- */
- public static final String EXCHANGE_KEY = "SA_REACTOR_EXCHANGE_KEY";
-
- /**
- * WebFilterChain key
- */
- public static final String CHAIN_KEY = "SA_REACTOR__CHAIN_KEY";
-
- /**
- * 在流式上下文写入 ServerWebExchange
- * @param ctx 必填
- * @param exchange 必填
- * @param chain 非必填
- * @return /
- */
- public static Context setContext(Context ctx, ServerWebExchange exchange, WebFilterChain chain) {
- return ctx
- .put(EXCHANGE_KEY, exchange)
- .put(CHAIN_KEY, chain);
- }
-
- /**
- * 在流式上下文获取 ServerWebExchange
- * @param ctx /
- * @return /
- */
- public static ServerWebExchange getExchange(ContextView ctx) {
- return ctx.get(EXCHANGE_KEY);
- }
-
- /**
- * 在流式上下文获取 WebFilterChain
- * @param ctx /
- * @return /
- */
- public static WebFilterChain getChain(ContextView ctx) {
- return ctx.get(CHAIN_KEY);
- }
-
- /**
- * 获取 Mono < ServerWebExchange >
- * @return /
- */
- public static Mono getMonoExchange() {
- return Mono.deferContextual(ctx -> Mono.just(getExchange(ctx)));
- }
-
- /**
- * 将 exchange 写入到同步上下文中,并执行一段代码,执行完毕清除上下文
- *
- * @return /
- */
- public static Mono sync(SaRetGenericFunction fun) {
- return Mono.deferContextual(ctx -> {
- try {
- SaReactorSyncHolder.setContext(ctx.get(EXCHANGE_KEY));
- return Mono.just(fun.run());
- } finally {
- SaReactorSyncHolder.clearContext();
- }
- });
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorSyncHolder.java b/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorSyncHolder.java
deleted file mode 100644
index a2c915c1..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorSyncHolder.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.context;
-
-import cn.dev33.satoken.SaManager;
-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.context.model.SaTokenContextModelBox;
-import cn.dev33.satoken.fun.SaRetGenericFunction;
-import cn.dev33.satoken.reactor.model.SaRequestForReactor;
-import cn.dev33.satoken.reactor.model.SaResponseForReactor;
-import cn.dev33.satoken.reactor.model.SaStorageForReactor;
-import org.springframework.web.server.ServerWebExchange;
-
-/**
- * Reactor上下文操作(同步),持有当前请求的 ServerWebExchange 全局引用
- *
- * @author click33
- * @since 1.19.0
- */
-public class SaReactorSyncHolder {
-
- /**
- * 在同步上下文写入 ServerWebExchange
- * @param exchange /
- */
- public static void setContext(ServerWebExchange exchange) {
- SaRequest request = new SaRequestForReactor(exchange.getRequest());
- SaResponse response = new SaResponseForReactor(exchange.getResponse());
- SaStorage storage = new SaStorageForReactor(exchange);
- SaManager.getSaTokenContext().setContext(request, response, storage);
- }
-
- /**
- * 在同步上下文清除 ServerWebExchange
- */
- public static void clearContext() {
- SaManager.getSaTokenContext().clearContext();
- }
-
- /**
- * 在同步上下文获取 ServerWebExchange
- * @return /
- */
- public static ServerWebExchange getExchange() {
- SaTokenContextModelBox box = SaManager.getSaTokenContext().getModelBox();
- return (ServerWebExchange)box.getStorage().getSource();
- }
-
- /**
- * 将 exchange 写入到同步上下文中,并执行一段代码,执行完毕清除上下文
- * @param exchange /
- * @param fun /
- */
- public static R setContext(ServerWebExchange exchange, SaRetGenericFunction fun) {
- try {
- setContext(exchange);
- return fun.run();
- } finally {
- clearContext();
- }
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaFirewallCheckFilterForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaFirewallCheckFilterForReactor.java
deleted file mode 100644
index 52a4b091..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaFirewallCheckFilterForReactor.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.filter;
-
-import cn.dev33.satoken.exception.BackResultException;
-import cn.dev33.satoken.exception.FirewallCheckException;
-import cn.dev33.satoken.exception.StopMatchException;
-import cn.dev33.satoken.reactor.context.SaReactorSyncHolder;
-import cn.dev33.satoken.reactor.model.SaRequestForReactor;
-import cn.dev33.satoken.reactor.model.SaResponseForReactor;
-import cn.dev33.satoken.reactor.util.SaReactorOperateUtil;
-import cn.dev33.satoken.strategy.SaFirewallStrategy;
-import cn.dev33.satoken.util.SaTokenConsts;
-import org.springframework.core.annotation.Order;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilter;
-import org.springframework.web.server.WebFilterChain;
-import reactor.core.publisher.Mono;
-
-/**
- * 防火墙校验过滤器 (Reactor版)
- *
- * @author click33
- * @since 1.37.0
- */
-@Order(SaTokenConsts.FIREWALL_CHECK_FILTER_ORDER)
-public class SaFirewallCheckFilterForReactor implements WebFilter {
-
- @Override
- public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
-
- SaRequestForReactor saRequest = new SaRequestForReactor(exchange.getRequest());
- SaResponseForReactor saResponse = new SaResponseForReactor(exchange.getResponse());
-
- try {
- SaReactorSyncHolder.setContext(exchange);
- SaFirewallStrategy.instance.check.execute(saRequest, saResponse, exchange);
- }
- catch (StopMatchException ignored) {}
- catch (BackResultException e) {
- return SaReactorOperateUtil.writeResult(exchange, e.getMessage());
- }
- // FirewallCheckException 异常则交由异常处理策略处理
- catch (FirewallCheckException e) {
- if(SaFirewallStrategy.instance.checkFailHandle == null) {
- return SaReactorOperateUtil.writeResult(exchange, e.getMessage());
- } else {
- SaFirewallStrategy.instance.checkFailHandle.run(e, saRequest, saResponse, null);
- return Mono.empty();
- }
- }
- finally {
- SaReactorSyncHolder.clearContext();
- }
- // 更多异常则不处理,交由 Web 框架处理
-
- // 向下执行
- return chain.filter(exchange);
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java b/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java
deleted file mode 100644
index 83c59151..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.filter;
-
-import cn.dev33.satoken.exception.BackResultException;
-import cn.dev33.satoken.exception.SaTokenException;
-import cn.dev33.satoken.exception.StopMatchException;
-import cn.dev33.satoken.filter.SaFilter;
-import cn.dev33.satoken.filter.SaFilterAuthStrategy;
-import cn.dev33.satoken.filter.SaFilterErrorStrategy;
-import cn.dev33.satoken.reactor.context.SaReactorSyncHolder;
-import cn.dev33.satoken.reactor.util.SaReactorOperateUtil;
-import cn.dev33.satoken.router.SaRouter;
-import cn.dev33.satoken.util.SaTokenConsts;
-import org.springframework.core.annotation.Order;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilter;
-import org.springframework.web.server.WebFilterChain;
-import reactor.core.publisher.Mono;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Reactor 全局鉴权过滤器
- *
- * 默认优先级为 -100,尽量保证在其它过滤器之前执行
- *
- *
- * @author click33
- * @since 1.34.0
- */
-@Order(SaTokenConsts.ASSEMBLY_ORDER)
-public class SaReactorFilter implements SaFilter, WebFilter {
-
- // ------------------------ 设置此过滤器 拦截 & 放行 的路由
-
- /**
- * 拦截路由
- */
- public List includeList = new ArrayList<>();
-
- /**
- * 放行路由
- */
- public List excludeList = new ArrayList<>();
-
- @Override
- public SaReactorFilter addInclude(String... paths) {
- includeList.addAll(Arrays.asList(paths));
- return this;
- }
-
- @Override
- public SaReactorFilter addExclude(String... paths) {
- excludeList.addAll(Arrays.asList(paths));
- return this;
- }
-
- @Override
- public SaReactorFilter setIncludeList(List pathList) {
- includeList = pathList;
- return this;
- }
-
- @Override
- public SaReactorFilter setExcludeList(List pathList) {
- excludeList = pathList;
- return this;
- }
-
-
- // ------------------------ 钩子函数
-
- /**
- * 认证函数:每次请求执行
- */
- public SaFilterAuthStrategy auth = r -> {};
-
- /**
- * 异常处理函数:每次[认证函数]发生异常时执行此函数
- */
- public SaFilterErrorStrategy error = e -> {
- throw new SaTokenException(e);
- };
-
- /**
- * 前置函数:在每次[认证函数]之前执行
- * 注意点:前置认证函数将不受 includeList 与 excludeList 的限制,所有路由的请求都会进入 beforeAuth
- */
- public SaFilterAuthStrategy beforeAuth = r -> {};
-
- @Override
- public SaReactorFilter setAuth(SaFilterAuthStrategy auth) {
- this.auth = auth;
- return this;
- }
-
- @Override
- public SaReactorFilter setError(SaFilterErrorStrategy error) {
- this.error = error;
- return this;
- }
-
- @Override
- public SaReactorFilter setBeforeAuth(SaFilterAuthStrategy beforeAuth) {
- this.beforeAuth = beforeAuth;
- return this;
- }
-
- // ------------------------ filter
-
- @Override
- public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
-
- // ---------- 全局认证处理
- try {
- SaReactorSyncHolder.setContext(exchange);
- beforeAuth.run(null);
- SaRouter.match(includeList).notMatch(excludeList).check(r -> auth.run(null));
- }
- catch (StopMatchException ignored) {}
- catch (BackResultException e) {
- return SaReactorOperateUtil.writeResult(exchange, e.getMessage());
- }
- catch (Throwable e) {
- return SaReactorOperateUtil.writeResult(exchange, String.valueOf(error.run(e)));
- }
- finally {
- SaReactorSyncHolder.clearContext();
- }
-
- return chain.filter(exchange);
- }
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenCorsFilterForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenCorsFilterForReactor.java
deleted file mode 100644
index 65a2b985..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenCorsFilterForReactor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.filter;
-
-import cn.dev33.satoken.context.SaHolder;
-import cn.dev33.satoken.context.model.SaTokenContextModelBox;
-import cn.dev33.satoken.exception.BackResultException;
-import cn.dev33.satoken.exception.StopMatchException;
-import cn.dev33.satoken.reactor.context.SaReactorSyncHolder;
-import cn.dev33.satoken.reactor.util.SaReactorOperateUtil;
-import cn.dev33.satoken.strategy.SaStrategy;
-import cn.dev33.satoken.util.SaTokenConsts;
-import org.springframework.core.annotation.Order;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilter;
-import org.springframework.web.server.WebFilterChain;
-import reactor.core.publisher.Mono;
-
-/**
- * CORS 跨域策略过滤器 (基于 Reactor)
- *
- * @author click33
- * @since 1.42.0
- */
-@Order(SaTokenConsts.CORS_FILTER_ORDER)
-public class SaTokenCorsFilterForReactor implements WebFilter {
-
- @Override
- public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
-
- try {
- SaReactorSyncHolder.setContext(exchange);
- SaTokenContextModelBox box = SaHolder.getContext().getModelBox();
- SaStrategy.instance.corsHandle.execute(box.getRequest(), box.getResponse(), box.getStorage());
- }
- catch (StopMatchException ignored) {}
- catch (BackResultException e) {
- return SaReactorOperateUtil.writeResult(exchange, e.getMessage());
- }
- finally {
- SaReactorSyncHolder.clearContext();
- }
-
- return chain.filter(exchange);
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java
deleted file mode 100644
index ce2e4275..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.model;
-
-
-import cn.dev33.satoken.SaManager;
-import cn.dev33.satoken.application.ApplicationInfo;
-import cn.dev33.satoken.context.model.SaRequest;
-import cn.dev33.satoken.reactor.context.SaReactorHolder;
-import cn.dev33.satoken.reactor.context.SaReactorSyncHolder;
-import cn.dev33.satoken.util.SaFoxUtil;
-import org.springframework.http.HttpCookie;
-import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.server.WebFilterChain;
-
-import java.util.Collection;
-import java.util.Map;
-
-/**
- * 对 SaRequest 包装类的实现(Reactor 响应式编程版)
- *
- * @author click33
- * @since 1.34.0
- */
-public class SaRequestForReactor implements SaRequest {
-
- /**
- * 底层Request对象
- */
- protected ServerHttpRequest request;
-
- /**
- * 实例化
- * @param request request对象
- */
- public SaRequestForReactor(ServerHttpRequest request) {
- this.request = request;
- }
-
- /**
- * 获取底层源对象
- */
- @Override
- public Object getSource() {
- return request;
- }
-
- /**
- * 在 [请求体] 里获取一个值
- */
- @Override
- public String getParam(String name) {
- return request.getQueryParams().getFirst(name);
- }
-
- /**
- * 获取 [请求体] 里提交的所有参数名称
- * @return 参数名称列表
- */
- @Override
- public Collection getParamNames(){
- return request.getQueryParams().keySet();
- }
-
- /**
- * 获取 [请求体] 里提交的所有参数
- * @return 参数列表
- */
- @Override
- public Map getParamMap(){
- return request.getQueryParams().toSingleValueMap();
- }
-
- /**
- * 在 [请求头] 里获取一个值
- */
- @Override
- public String getHeader(String name) {
- return request.getHeaders().getFirst(name);
- }
-
- /**
- * 在 [Cookie作用域] 里获取一个值
- */
- @Override
- public String getCookieValue(String name) {
- return getCookieLastValue(name);
- }
-
- /**
- * 在 [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
- */
- @Override
- public String getCookieFirstValue(String name){
- HttpCookie cookie = request.getCookies().getFirst(name);
- if(cookie == null) {
- return null;
- }
- return cookie.getValue();
- }
-
- /**
- * 在 [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
- * @param name 键
- * @return 值
- */
- @Override
- public String getCookieLastValue(String name){
- String value = null;
- String cookieStr = getHeader("Cookie");
- if(SaFoxUtil.isNotEmpty(cookieStr)) {
- String[] cookieItems = cookieStr.split(";");
- for (String item : cookieItems) {
- String[] kv = item.split("=");
- if (kv.length == 2) {
- if (kv[0].trim().equals(name)) {
- value = kv[1].trim();
- }
- }
- }
- }
- return value;
-
- // 此种写法无法获取到最后一个 Cookie,WebFlux 底层代码应该是有bug,前端提交多个同名Cookie时只能解析出第一个来
- // List cookies = request.getCookies().get(name);
- // if(cookies.isEmpty()) {
- // return null;
- // }
- // return cookies.get(cookies.size() - 1).getValue();
- }
-
- /**
- * 返回当前请求path (不包括上下文名称)
- */
- @Override
- public String getRequestPath() {
- return ApplicationInfo.cutPathPrefix(request.getPath().toString());
- }
-
- /**
- * 返回当前请求的url,例:http://xxx.com/test
- * @return see note
- */
- public String getUrl() {
- String currDomain = SaManager.getConfig().getCurrDomain();
- if( ! SaFoxUtil.isEmpty(currDomain)) {
- return currDomain + this.getRequestPath();
- }
- return request.getURI().toString();
- }
-
- /**
- * 返回当前请求的类型
- */
- @Override
- public String getMethod() {
- return request.getMethod().name();
- }
-
- /**
- * 查询请求 host
- */
- @Override
- public String getHost() {
- return request.getURI().getHost();
- }
-
- /**
- * 转发请求
- */
- @Override
- public Object forward(String path) {
- ServerWebExchange exchange = SaReactorSyncHolder.getExchange();
- WebFilterChain chain = exchange.getAttribute(SaReactorHolder.CHAIN_KEY);
-
- ServerHttpRequest newRequest = request.mutate().path(path).build();
- ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
-
- return chain.filter(newExchange);
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java
deleted file mode 100644
index 6fb5ac86..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.model;
-
-import java.net.URI;
-
-import org.springframework.http.HttpStatus;
-import org.springframework.http.server.reactive.ServerHttpResponse;
-
-import cn.dev33.satoken.context.model.SaResponse;
-
-/**
- * 对 SaResponse 包装类的实现(Reactor 响应式编程版)
- *
- * @author click33
- * @since 1.34.0
- */
-public class SaResponseForReactor implements SaResponse {
-
- /**
- * 底层Response对象
- */
- protected ServerHttpResponse response;
-
- /**
- * 实例化
- * @param response response对象
- */
- public SaResponseForReactor(ServerHttpResponse response) {
- this.response = response;
- }
-
- /**
- * 获取底层源对象
- */
- @Override
- public Object getSource() {
- return response;
- }
-
- /**
- * 设置响应状态码
- */
- @Override
- public SaResponse setStatus(int sc) {
- response.setStatusCode(HttpStatus.valueOf(sc));
- return this;
- }
-
- /**
- * 在响应头里写入一个值
- */
- @Override
- public SaResponse setHeader(String name, String value) {
- response.getHeaders().set(name, value);
- return this;
- }
-
- /**
- * 在响应头里添加一个值
- * @param name 名字
- * @param value 值
- * @return 对象自身
- */
- public SaResponse addHeader(String name, String value) {
- response.getHeaders().add(name, value);
- return this;
- }
-
- /**
- * 重定向
- */
- @Override
- public Object redirect(String url) {
- response.setStatusCode(HttpStatus.FOUND);
- response.getHeaders().setLocation(URI.create(url));
- return null;
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/model/SaStorageForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/model/SaStorageForReactor.java
deleted file mode 100644
index 55e35ea8..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/model/SaStorageForReactor.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.model;
-
-import org.springframework.web.server.ServerWebExchange;
-
-import cn.dev33.satoken.context.model.SaStorage;
-
-/**
- * 对 SaStorage 包装类的实现(Reactor 响应式编程版)
- *
- * @author click33
- * @since 1.34.0
- */
-public class SaStorageForReactor implements SaStorage {
-
- /**
- * 底层 ServerWebExchange 对象
- */
- protected ServerWebExchange exchange;
-
- /**
- * 实例化
- * @param exchange exchange对象
- */
- public SaStorageForReactor(ServerWebExchange exchange) {
- this.exchange = exchange;
- }
-
- /**
- * 获取底层源对象
- */
- @Override
- public Object getSource() {
- return exchange;
- }
-
- /**
- * 在 [Request作用域] 里写入一个值
- */
- @Override
- public SaStorageForReactor set(String key, Object value) {
- exchange.getAttributes().put(key, value);
- return this;
- }
-
- /**
- * 在 [Request作用域] 里获取一个值
- */
- @Override
- public Object get(String key) {
- return exchange.getAttributes().get(key);
- }
-
- /**
- * 在 [Request作用域] 里删除一个值
- */
- @Override
- public SaStorageForReactor delete(String key) {
- exchange.getAttributes().remove(key);
- return this;
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/package-info.java b/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/package-info.java
index ddf7b50d..74cf87f1 100644
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/package-info.java
+++ b/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/package-info.java
@@ -13,7 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
/**
- * Sa-Token 集成 Reactor 响应式编程的各个组件
+ * Sa-Token 集成 Reactor 响应式编程 (SpringBoot 4.x)
*/
package cn.dev33.satoken.reactor;
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextRegister.java b/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextRegister.java
deleted file mode 100644
index 559be296..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextRegister.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.spring;
-
-import cn.dev33.satoken.reactor.filter.SaFirewallCheckFilterForReactor;
-import cn.dev33.satoken.reactor.filter.SaTokenContextFilterForReactor;
-import cn.dev33.satoken.reactor.filter.SaTokenCorsFilterForReactor;
-import cn.dev33.satoken.spring.pathmatch.SaPathPatternParserUtil;
-import cn.dev33.satoken.strategy.SaStrategy;
-import org.springframework.context.annotation.Bean;
-
-/**
- * 注册 Sa-Token 所需要的 Bean
- *
- * @author click33
- * @since 1.34.0
- */
-public class SaTokenContextRegister {
-
- public SaTokenContextRegister() {
- // 重写路由匹配算法
- SaStrategy.instance.routeMatcher = (pattern, path) -> {
- return SaPathPatternParserUtil.match(pattern, path);
- };
- }
-
- /**
- * 上下文过滤器
- *
- * @return /
- */
- @Bean
- public SaTokenContextFilterForReactor saTokenContextFilterForServlet() {
- return new SaTokenContextFilterForReactor();
- }
-
- /**
- * CORS 跨域策略过滤器
- *
- * @return /
- */
- @Bean
- public SaTokenCorsFilterForReactor saTokenCorsFilterForReactor() {
- return new SaTokenCorsFilterForReactor();
- }
-
- /**
- * 防火墙过滤器
- *
- * @return /
- */
- @Bean
- public SaFirewallCheckFilterForReactor saFirewallCheckFilterForReactor() {
- return new SaFirewallCheckFilterForReactor();
- }
-
-}
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/util/SaReactorOperateUtil.java b/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/util/SaReactorOperateUtil.java
deleted file mode 100644
index 706501bf..00000000
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/util/SaReactorOperateUtil.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2020-2099 sa-token.cc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package cn.dev33.satoken.reactor.util;
-
-import cn.dev33.satoken.util.SaTokenConsts;
-import org.springframework.web.server.ServerWebExchange;
-import reactor.core.publisher.Mono;
-
-/**
- * Reactor 操作工具类
- *
- * @author click33
- * @since 1.42.0
- */
-public class SaReactorOperateUtil {
-
- /**
- * 写入结果到输出流
- * @param exchange /
- * @param result /
- * @return /
- */
- public static Mono writeResult(ServerWebExchange exchange, String result) {
- // 写入输出流
- // 请注意此处默认 Content-Type 为 text/plain,如果需要返回 JSON 信息,需要在 return 前自行设置 Content-Type 为 application/json
- // 例如:SaHolder.getResponse().setHeader("Content-Type", "application/json;charset=UTF-8");
- if(exchange.getResponse().getHeaders().getFirst(SaTokenConsts.CONTENT_TYPE_KEY) == null) {
- exchange.getResponse().getHeaders().set(SaTokenConsts.CONTENT_TYPE_KEY, SaTokenConsts.CONTENT_TYPE_TEXT_PLAIN);
- }
- return exchange.getResponse().writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(result.getBytes())));
- }
-
-}
diff --git a/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/pom.xml b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/pom.xml
new file mode 100644
index 00000000..aa006b5f
--- /dev/null
+++ b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/pom.xml
@@ -0,0 +1,79 @@
+
+
+ 4.0.0
+
+
+ cn.dev33
+ sa-token-starter
+ ${revision}
+ ../pom.xml
+
+ jar
+
+ sa-token-spring-boot-reactor-v2v3v4-common
+ sa-token-spring-boot-reactor-v2v3v4-common
+ sa-token springboot reactor v2/v3/v4 common
+
+
+
+
+
+ cn.dev33
+ sa-token-core
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+ true
+
+
+
+
+ org.springframework
+ spring-web
+ true
+
+
+
+
+ io.projectreactor
+ reactor-core
+ true
+
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+
+
+ cn.dev33
+ sa-token-spring-boot-webmvc-reactor-v2v3v4-common
+
+
+
+
+
+
+
+
+
+
+ cn.dev33
+ sa-token-spring-boot2-dependencies
+ ${revision}
+ pom
+ import
+
+
+
+
+
+
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorHolder.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/context/SaReactorHolder.java
similarity index 100%
rename from sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorHolder.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/context/SaReactorHolder.java
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorSyncHolder.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/context/SaReactorSyncHolder.java
similarity index 100%
rename from sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorSyncHolder.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/context/SaReactorSyncHolder.java
diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaFirewallCheckFilterForReactor.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/filter/SaFirewallCheckFilterForReactor.java
similarity index 100%
rename from sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaFirewallCheckFilterForReactor.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/filter/SaFirewallCheckFilterForReactor.java
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java
similarity index 100%
rename from sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenContextFilterForReactor.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenContextFilterForReactor.java
similarity index 100%
rename from sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenContextFilterForReactor.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenContextFilterForReactor.java
diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenCorsFilterForReactor.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenCorsFilterForReactor.java
similarity index 100%
rename from sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenCorsFilterForReactor.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/filter/SaTokenCorsFilterForReactor.java
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java
similarity index 100%
rename from sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/model/SaRequestForReactor.java
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java
similarity index 100%
rename from sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/model/SaStorageForReactor.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/model/SaStorageForReactor.java
similarity index 100%
rename from sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/model/SaStorageForReactor.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/model/SaStorageForReactor.java
diff --git a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/package-info.java
similarity index 57%
rename from sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/package-info.java
index 1b4e785a..ddf7b50d 100644
--- a/sa-token-starter/sa-token-reactor-spring-boot4-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java
+++ b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/package-info.java
@@ -13,18 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package cn.dev33.satoken.reactor.spring;
-
-import cn.dev33.satoken.context.SaTokenContextForThreadLocal;
-
/**
- * 此为低版本(<1.42.0) 的上下文处理方案,仅做留档,如无必要请勿使用
- *
- * Sa-Token 上下文处理器 [ Spring Reactor 版本实现 ] ,基于 SaTokenContextForThreadLocal 定制
- *
- * @author click33
- * @since 1.33.0
+ * Sa-Token 集成 Reactor 响应式编程的各个组件
*/
-public class SaTokenContextForSpringReactor extends SaTokenContextForThreadLocal {
-
-}
+package cn.dev33.satoken.reactor;
diff --git a/sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java
similarity index 100%
rename from sa-token-starter/sa-token-reactor-spring-boot3-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java
diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextRegister.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextRegister.java
similarity index 100%
rename from sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextRegister.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextRegister.java
diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/util/SaReactorOperateUtil.java b/sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/util/SaReactorOperateUtil.java
similarity index 100%
rename from sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/util/SaReactorOperateUtil.java
rename to sa-token-starter/sa-token-spring-boot-reactor-v2v3v4-common/src/main/java/cn/dev33/satoken/reactor/util/SaReactorOperateUtil.java
diff --git a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SpringBootVersionCompatibilityChecker.java b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SpringBootVersionCompatibilityChecker.java
index 721fddfe..1684f6c8 100644
--- a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SpringBootVersionCompatibilityChecker.java
+++ b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SpringBootVersionCompatibilityChecker.java
@@ -5,7 +5,7 @@ import cn.dev33.satoken.util.SaFoxUtil;
import org.springframework.boot.SpringBootVersion;
/**
- * SpringBoot 版本与 Sa-Token 版本兼容检查器,当开发者错误的在 SpringBoot3.x 项目中引入当前集成包时,将在控制台做出提醒并阻断项目启动
+ * SpringBoot 版本与 Sa-Token 版本兼容检查器,当开发者错误的在 SpringBoot3/4.x 项目中引入当前集成包时,将在控制台做出提醒并阻断项目启动
*
* @author Uncarbon
* @since 1.38.0
@@ -18,7 +18,7 @@ public class SpringBootVersionCompatibilityChecker {
return;
}
String str = "当前 SpringBoot 版本(" + version + ")与 Sa-Token 依赖不兼容," +
- "请将依赖 sa-token-spring-boot-starter 修改为:sa-token-spring-boot3-starter";
+ "请将依赖 sa-token-spring-boot-starter 修改为:sa-token-spring-boot3/4-starter";
System.err.println(str);
throw new SaTokenException(str);
}