diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 0cf5d75..7932393 100755
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -7,10 +7,14 @@
+
+
+
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 1c5170e..ed81959 100755
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -12,6 +12,11 @@
+
diff --git a/han-note-auth/pom.xml b/han-note-auth/pom.xml
index f48f523..7f37689 100755
--- a/han-note-auth/pom.xml
+++ b/han-note-auth/pom.xml
@@ -93,8 +93,10 @@
com.hanserwei
hanserwei-common
-
-
+
+ com.hanserwei
+ hanserwei-spring-boot-starter-biz-context
+
diff --git a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/service/impl/UserServiceImpl.java b/han-note-auth/src/main/java/com/hanserwei/hannote/auth/service/impl/UserServiceImpl.java
index 2838e5d..db00b49 100644
--- a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/service/impl/UserServiceImpl.java
+++ b/han-note-auth/src/main/java/com/hanserwei/hannote/auth/service/impl/UserServiceImpl.java
@@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.base.Preconditions;
+import com.hanserwei.framework.biz.context.holder.LoginUserContextHolder;
import com.hanserwei.framework.common.enums.DeletedEnum;
import com.hanserwei.framework.common.enums.StatusEnum;
import com.hanserwei.framework.common.exception.ApiException;
@@ -21,13 +22,14 @@ import com.hanserwei.hannote.auth.domain.mapper.UserDOMapper;
import com.hanserwei.hannote.auth.domain.mapper.UserRoleDOMapper;
import com.hanserwei.hannote.auth.enums.LoginTypeEnum;
import com.hanserwei.hannote.auth.enums.ResponseCodeEnum;
-import com.hanserwei.hannote.auth.filter.LoginUserContextHolder;
import com.hanserwei.hannote.auth.model.vo.user.UserLoginReqVO;
import com.hanserwei.hannote.auth.service.UserService;
+import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
@@ -46,6 +48,8 @@ public class UserServiceImpl extends ServiceImpl implement
private final UserRoleDOMapper userRoleDOMapper;
private final TransactionTemplate transactionTemplate;
private final RoleDOMapper roleDOMapper;
+ @Resource(name = "authTaskExecutor")
+ private ThreadPoolTaskExecutor authTaskExecutor;
@Override
public Response loginAndRegister(UserLoginReqVO reqVO) {
@@ -147,6 +151,10 @@ public class UserServiceImpl extends ServiceImpl implement
@Override
public Response> logout() {
Long userId = LoginUserContextHolder.getUserId();
+ authTaskExecutor.submit(() -> {
+ Long userId2 = LoginUserContextHolder.getUserId();
+ log.info("==> 异步线程中获取 userId: {}", userId2);
+ });
StpUtil.logout(userId);
return Response.success();
}
diff --git a/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/pom.xml b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/pom.xml
new file mode 100644
index 0000000..6f4ca31
--- /dev/null
+++ b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/pom.xml
@@ -0,0 +1,48 @@
+
+ 4.0.0
+
+ com.hanserwei
+ hanserwei-framework
+ ${revision}
+
+
+ jar
+
+ hanserwei-spring-boot-starter-biz-context
+ ${project.artifactId}
+ 业务上下文组件
+
+
+
+ UTF-8
+
+
+
+
+ com.hanserwei
+ hanserwei-common
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+ jakarta.servlet
+ jakarta.servlet-api
+
+
+ org.springframework
+ spring-web
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+ com.alibaba
+ transmittable-thread-local
+
+
+
+
diff --git a/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/config/ContextAutoConfiguration.java b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/config/ContextAutoConfiguration.java
new file mode 100644
index 0000000..6e9a533
--- /dev/null
+++ b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/config/ContextAutoConfiguration.java
@@ -0,0 +1,13 @@
+package com.hanserwei.framework.biz.context.config;
+
+import com.hanserwei.framework.biz.context.filter.HeaderUserId2ContextFilter;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.context.annotation.Bean;
+
+@AutoConfiguration
+public class ContextAutoConfiguration {
+ @Bean
+ public HeaderUserId2ContextFilter headerUserId2ContextFilter() {
+ return new HeaderUserId2ContextFilter();
+ }
+}
diff --git a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/filter/HeaderUserId2ContextFilter.java b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/filter/HeaderUserId2ContextFilter.java
similarity index 74%
rename from han-note-auth/src/main/java/com/hanserwei/hannote/auth/filter/HeaderUserId2ContextFilter.java
rename to hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/filter/HeaderUserId2ContextFilter.java
index 68cef3c..fcfe06f 100644
--- a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/filter/HeaderUserId2ContextFilter.java
+++ b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/filter/HeaderUserId2ContextFilter.java
@@ -1,5 +1,6 @@
-package com.hanserwei.hannote.auth.filter;
+package com.hanserwei.framework.biz.context.filter;
+import com.hanserwei.framework.biz.context.holder.LoginUserContextHolder;
import com.hanserwei.framework.common.constant.GlobalConstants;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
@@ -12,18 +13,17 @@ import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
-@Component
@Slf4j
public class HeaderUserId2ContextFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws ServletException, IOException {
-
- // 从请求头中获取用户 ID
+ log.info("=====> HeaderUserId2ContextFilter 开始执行");
+ // 从请求头中获取用户 ID
String userId = request.getHeader(GlobalConstants.USER_ID);
- log.info("## HeaderUserId2ContextFilter, 用户 ID: {}", userId);
+ log.info("=====> HeaderUserId2ContextFilter, 用户 ID: {}", userId);
// 判断请求头中是否存在用户 ID
if (StringUtils.isBlank(userId)) {
@@ -33,7 +33,7 @@ public class HeaderUserId2ContextFilter extends OncePerRequestFilter {
}
// 如果 header 中存在 userId,则设置到 ThreadLocal 中
- log.info("===== 设置 userId 到 ThreadLocal 中, 用户 ID: {}", userId);
+ log.info("=====> 设置 userId 到 ThreadLocal 中, 用户 ID: {}", userId);
LoginUserContextHolder.setUserId(userId);
try {
@@ -41,7 +41,7 @@ public class HeaderUserId2ContextFilter extends OncePerRequestFilter {
} finally {
// 一定要删除 ThreadLocal ,防止内存泄露
LoginUserContextHolder.remove();
- log.info("===== 删除 ThreadLocal, userId: {}", userId);
+ log.info("=====> 删除 ThreadLocal, userId: {}", userId);
}
}
}
\ No newline at end of file
diff --git a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/filter/LoginUserContextHolder.java b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/holder/LoginUserContextHolder.java
similarity index 85%
rename from han-note-auth/src/main/java/com/hanserwei/hannote/auth/filter/LoginUserContextHolder.java
rename to hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/holder/LoginUserContextHolder.java
index f08b414..95dd8b6 100644
--- a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/filter/LoginUserContextHolder.java
+++ b/hanserwei-framework/hanserwei-spring-boot-starter-biz-context/src/main/java/com/hanserwei/framework/biz/context/holder/LoginUserContextHolder.java
@@ -1,5 +1,6 @@
-package com.hanserwei.hannote.auth.filter;
+package com.hanserwei.framework.biz.context.holder;
+import com.alibaba.ttl.TransmittableThreadLocal;
import com.hanserwei.framework.common.constant.GlobalConstants;
import java.util.HashMap;
@@ -10,7 +11,7 @@ public class LoginUserContextHolder {
// 初始化一个 ThreadLocal 变量
private static final ThreadLocal