diff --git a/sa-token-plugin/pom.xml b/sa-token-plugin/pom.xml
index 80213083..9d9a871a 100644
--- a/sa-token-plugin/pom.xml
+++ b/sa-token-plugin/pom.xml
@@ -33,6 +33,7 @@
sa-token-temp-jwt
sa-token-jwt
sa-token-context-dubbo
+ sa-token-context-dubbo3
sa-token-context-grpc
diff --git a/sa-token-plugin/sa-token-context-dubbo3/pom.xml b/sa-token-plugin/sa-token-context-dubbo3/pom.xml
new file mode 100644
index 00000000..76ebd5d4
--- /dev/null
+++ b/sa-token-plugin/sa-token-context-dubbo3/pom.xml
@@ -0,0 +1,40 @@
+
+
+ 4.0.0
+
+ cn.dev33
+ sa-token-plugin
+ ${revision}
+ ../pom.xml
+
+
+ sa-token-context-dubbo3
+ sa-token-context-dubbo3
+ sa-token-context-dubbo3
+
+
+
+ 3.1.5
+ 8
+ 8
+ UTF-8
+
+
+
+
+
+ cn.dev33
+ sa-token-core
+
+
+
+
+ org.apache.dubbo
+ dubbo
+ ${dubbo3.version}
+
+
+
+
\ No newline at end of file
diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/SaTokenSecondContextCreatorForDubbo3.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/SaTokenSecondContextCreatorForDubbo3.java
new file mode 100644
index 00000000..4494dbab
--- /dev/null
+++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/SaTokenSecondContextCreatorForDubbo3.java
@@ -0,0 +1,20 @@
+package cn.dev33.satoken.context.dubbo3;
+
+
+import cn.dev33.satoken.context.second.SaTokenSecondContext;
+import cn.dev33.satoken.context.second.SaTokenSecondContextCreator;
+
+/**
+ * Sa-Token 二级Context - 创建器 [Dubbo3版]
+ *
+ * @author kong
+ *
+ */
+public class SaTokenSecondContextCreatorForDubbo3 implements SaTokenSecondContextCreator {
+
+ @Override
+ public SaTokenSecondContext create() {
+ return new SaTokenSecondContextForDubbo3();
+ }
+
+}
diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/SaTokenSecondContextForDubbo3.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/SaTokenSecondContextForDubbo3.java
new file mode 100644
index 00000000..c254ff0c
--- /dev/null
+++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/SaTokenSecondContextForDubbo3.java
@@ -0,0 +1,46 @@
+package cn.dev33.satoken.context.dubbo3;
+
+import cn.dev33.satoken.context.dubbo3.model.SaRequestForDubbo3;
+import cn.dev33.satoken.context.dubbo3.model.SaResponseForDubbo3;
+import cn.dev33.satoken.context.dubbo3.model.SaStorageForDubbo3;
+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.second.SaTokenSecondContext;
+import cn.dev33.satoken.exception.ApiDisabledException;
+import org.apache.dubbo.rpc.RpcContext;
+
+/**
+ * Sa-Token 上下文 [Dubbo3版本]
+ *
+ * @author kong
+ *
+ */
+public class SaTokenSecondContextForDubbo3 implements SaTokenSecondContext {
+
+ @Override
+ public SaRequest getRequest() {
+ return new SaRequestForDubbo3(RpcContext.getServiceContext());
+ }
+
+ @Override
+ public SaResponse getResponse() {
+ return new SaResponseForDubbo3(RpcContext.getServiceContext());
+ }
+
+ @Override
+ public SaStorage getStorage() {
+ return new SaStorageForDubbo3(RpcContext.getServiceContext());
+ }
+
+ @Override
+ public boolean matchPath(String pattern, String path) {
+ throw new ApiDisabledException();
+ }
+
+ @Override
+ public boolean isValid() {
+ return RpcContext.getServiceContext() != null;
+ }
+
+}
diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ConsumerFilter.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ConsumerFilter.java
new file mode 100644
index 00000000..cc63a641
--- /dev/null
+++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ConsumerFilter.java
@@ -0,0 +1,45 @@
+package cn.dev33.satoken.context.dubbo3.filter;
+
+import cn.dev33.satoken.SaManager;
+import cn.dev33.satoken.context.SaTokenContextDefaultImpl;
+import cn.dev33.satoken.same.SaSameUtil;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.dev33.satoken.util.SaTokenConsts;
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.rpc.*;
+
+/**
+ *
+ * Sa-Token 整合 Dubbo3 Consumer端过滤器
+ *
+ * @author kong
+ *
+ */
+@Activate(group = {CommonConstants.CONSUMER}, order = -30000)
+public class SaTokenDubbo3ConsumerFilter implements Filter {
+
+ @Override
+ public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {
+
+ // 追加 Same-Token 参数
+ if(SaManager.getConfig().getCheckSameToken()) {
+ RpcContext.getServiceContext().setAttachment(SaSameUtil.SAME_TOKEN,SaSameUtil.getToken());
+ }
+
+ // 1. 调用前,向下传递会话Token
+ if(SaManager.getSaTokenContextOrSecond() != SaTokenContextDefaultImpl.defaultContext) {
+ RpcContext.getServiceContext().setAttachment(SaTokenConsts.JUST_CREATED, StpUtil.getTokenValueNotCut());
+ }
+
+ // 2. 开始调用
+ Result invoke = invoker.invoke(invocation);
+
+ // 3. 调用后,解析回传的Token值
+ StpUtil.setTokenValue(invoke.getAttachment(SaTokenConsts.JUST_CREATED_NOT_PREFIX));
+
+ // note
+ return invoke;
+ }
+
+}
diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ProviderFilter.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ProviderFilter.java
new file mode 100644
index 00000000..a353c9ac
--- /dev/null
+++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ProviderFilter.java
@@ -0,0 +1,36 @@
+package cn.dev33.satoken.context.dubbo3.filter;
+
+import cn.dev33.satoken.SaManager;
+import cn.dev33.satoken.same.SaSameUtil;
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.rpc.*;
+
+/**
+ *
+ * Sa-Token 整合 Dubbo3 Provider端过滤器
+ *
+ * @author kong
+ *
+ */
+@Activate(group = {CommonConstants.PROVIDER}, order = -30000)
+public class SaTokenDubbo3ProviderFilter implements Filter {
+
+ @Override
+ public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {
+
+ // RPC 调用鉴权
+ if(SaManager.getConfig().getCheckSameToken()) {
+ String idToken = invocation.getAttachment(SaSameUtil.SAME_TOKEN);
+ // dubbo部分协议会将参数变为小写,详细参考:https://gitee.com/dromara/sa-token/issues/I4WXQG
+ if(idToken == null) {
+ idToken = invocation.getAttachment(SaSameUtil.SAME_TOKEN.toLowerCase());
+ }
+ SaSameUtil.checkToken(idToken);
+ }
+
+ // 开始调用
+ return invoker.invoke(invocation);
+ }
+
+}
diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaRequestForDubbo3.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaRequestForDubbo3.java
new file mode 100644
index 00000000..655cdd95
--- /dev/null
+++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaRequestForDubbo3.java
@@ -0,0 +1,98 @@
+package cn.dev33.satoken.context.dubbo3.model;
+
+import cn.dev33.satoken.context.model.SaRequest;
+import org.apache.dubbo.rpc.RpcContext;
+
+/**
+ * Request for Dubbo3
+ *
+ * @author kong
+ *
+ */
+public class SaRequestForDubbo3 implements SaRequest {
+
+ /**
+ * 底层对象
+ */
+ protected RpcContext rpcContext;
+
+ /**
+ * 实例化
+ * @param rpcContext rpcContext对象
+ */
+ public SaRequestForDubbo3(RpcContext rpcContext) {
+ this.rpcContext = rpcContext;
+ }
+
+ /**
+ * 获取底层源对象
+ */
+ @Override
+ public Object getSource() {
+ return rpcContext;
+ }
+
+ /**
+ * 在 [请求体] 里获取一个值
+ */
+ @Override
+ public String getParam(String name) {
+ // 不传播 url 参数
+ return null;
+ }
+
+ /**
+ * 在 [请求头] 里获取一个值
+ */
+ @Override
+ public String getHeader(String name) {
+ // 不传播 header 参数
+ return null;
+ }
+
+ /**
+ * 在 [Cookie作用域] 里获取一个值
+ */
+ @Override
+ public String getCookieValue(String name) {
+ // 不传播 cookie 参数
+ return null;
+ }
+
+ /**
+ * 返回当前请求path (不包括上下文名称)
+ */
+ @Override
+ public String getRequestPath() {
+ // 不传播 requestPath
+ return null;
+ }
+
+ /**
+ * 返回当前请求的url,例:http://xxx.com/test
+ * @return see note
+ */
+ public String getUrl() {
+ // 不传播 url
+ return null;
+ }
+
+ /**
+ * 返回当前请求的类型
+ */
+ @Override
+ public String getMethod() {
+ // 不传播 method
+ return null;
+ }
+
+ /**
+ * 转发请求
+ */
+ @Override
+ public Object forward(String path) {
+ // 不传播 forward 动作
+ return null;
+ }
+
+}
diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaResponseForDubbo3.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaResponseForDubbo3.java
new file mode 100644
index 00000000..59e933da
--- /dev/null
+++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaResponseForDubbo3.java
@@ -0,0 +1,74 @@
+package cn.dev33.satoken.context.dubbo3.model;
+
+
+import cn.dev33.satoken.context.model.SaResponse;
+import org.apache.dubbo.rpc.RpcContext;
+
+/**
+ * Response for Servlet
+ * @author kong
+ *
+ */
+public class SaResponseForDubbo3 implements SaResponse {
+
+ /**
+ * 底层Request对象
+ */
+ protected RpcContext rpcContext;
+
+ /**
+ * 实例化
+ * @param rpcContext rpcContext对象
+ */
+ public SaResponseForDubbo3(RpcContext rpcContext) {
+ this.rpcContext = rpcContext;
+ }
+
+ /**
+ * 获取底层源对象
+ */
+ @Override
+ public Object getSource() {
+ return rpcContext;
+ }
+
+ /**
+ * 设置响应状态码
+ */
+ @Override
+ public SaResponse setStatus(int sc) {
+ // 不回传 status 状态
+ return this;
+ }
+
+ /**
+ * 在响应头里写入一个值
+ */
+ @Override
+ public SaResponse setHeader(String name, String value) {
+ // 不回传 header响应头
+ return this;
+ }
+
+ /**
+ * 在响应头里添加一个值
+ * @param name 名字
+ * @param value 值
+ * @return 对象自身
+ */
+ public SaResponse addHeader(String name, String value) {
+ // 不回传 header响应头
+ return this;
+ }
+
+ /**
+ * 重定向
+ */
+ @Override
+ public Object redirect(String url) {
+ // 不回传 重定向 动作
+ return null;
+ }
+
+
+}
diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaStorageForDubbo3.java b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaStorageForDubbo3.java
new file mode 100644
index 00000000..686ae5e2
--- /dev/null
+++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/java/cn/dev33/satoken/context/dubbo3/model/SaStorageForDubbo3.java
@@ -0,0 +1,65 @@
+package cn.dev33.satoken.context.dubbo3.model;
+
+import cn.dev33.satoken.context.model.SaStorage;
+import cn.dev33.satoken.util.SaTokenConsts;
+import org.apache.dubbo.rpc.RpcContext;
+
+/**
+ * Storage for Servlet
+ * @author kong
+ *
+ */
+public class SaStorageForDubbo3 implements SaStorage {
+
+ /**
+ * 底层对象
+ */
+ protected RpcContext rpcContext;
+
+ /**
+ * 实例化
+ * @param rpcContext rpcContext对象
+ */
+ public SaStorageForDubbo3(RpcContext rpcContext) {
+ this.rpcContext = rpcContext;
+ }
+
+ /**
+ * 获取底层源对象
+ */
+ @Override
+ public Object getSource() {
+ return rpcContext;
+ }
+
+ /**
+ * 在 [Request作用域] 里写入一个值
+ */
+ @Override
+ public SaStorageForDubbo3 set(String key, Object value) {
+ rpcContext.setObjectAttachment(key, value);
+ // 如果是token写入,则回传到Consumer端
+ if(key.equals(SaTokenConsts.JUST_CREATED_NOT_PREFIX)) {
+ RpcContext.getServerContext().setAttachment(key, value);
+ }
+ return this;
+ }
+
+ /**
+ * 在 [Request作用域] 里获取一个值
+ */
+ @Override
+ public Object get(String key) {
+ return rpcContext.getObjectAttachment(key);
+ }
+
+ /**
+ * 在 [Request作用域] 里删除一个值
+ */
+ @Override
+ public SaStorageForDubbo3 delete(String key) {
+ rpcContext.removeAttachment(key);
+ return this;
+ }
+
+}
diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter b/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter
new file mode 100644
index 00000000..739e5457
--- /dev/null
+++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter
@@ -0,0 +1,2 @@
+saTokenDubbo3ConsumerFilter=cn.dev33.satoken.context.dubbo3.filter.SaTokenDubbo3ConsumerFilter
+saTokenDubbo3ProviderFilter=cn.dev33.satoken.context.dubbo3.filter.SaTokenDubbo3ProviderFilter
\ No newline at end of file
diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/spring.factories b/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/spring.factories
new file mode 100644
index 00000000..844bf4bd
--- /dev/null
+++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/spring.factories
@@ -0,0 +1 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.dev33.satoken.context.dubbo3.SaTokenSecondContextCreatorForDubbo3
\ No newline at end of file
diff --git a/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 00000000..cff10092
--- /dev/null
+++ b/sa-token-plugin/sa-token-context-dubbo3/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1 @@
+cn.dev33.satoken.context.dubbo3.SaTokenSecondContextCreatorForDubbo3
\ No newline at end of file
diff --git a/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/web/SaQuickController.java b/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/web/SaQuickController.java
index 99826d00..b3d5c5bd 100644
--- a/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/web/SaQuickController.java
+++ b/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/web/SaQuickController.java
@@ -22,7 +22,7 @@ public class SaQuickController {
/**
* 进入登录页面
- * @param request see note
+ * @param model see note
* @return see note
*/
@GetMapping("/saLogin")