From 2d7b3790b9d98dcc3453d266ce712024e33c83ea Mon Sep 17 00:00:00 2001
From: xiongxiaoyang <773861846@qq.com>
Date: Wed, 18 May 2022 15:34:07 +0800
Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7?=
 =?UTF-8?q?=E8=AE=A4=E8=AF=81=E6=B5=81=E7=A8=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../controller/front/UserController.java      | 10 +++--
 .../xxyopen/novel/core/auth/AuthStrategy.java |  3 ++
 .../novel/core/auth/AuthorAuthStrategy.java   |  3 ++
 .../xxyopen/novel/core/auth/UserHolder.java   | 45 +++++++++++++++++++
 .../core/intercepter/AuthInterceptor.java     | 15 +++++--
 5 files changed, 69 insertions(+), 7 deletions(-)
 create mode 100644 src/main/java/io/github/xxyopen/novel/core/auth/UserHolder.java

diff --git a/src/main/java/io/github/xxyopen/novel/controller/front/UserController.java b/src/main/java/io/github/xxyopen/novel/controller/front/UserController.java
index b06851a..87b7298 100644
--- a/src/main/java/io/github/xxyopen/novel/controller/front/UserController.java
+++ b/src/main/java/io/github/xxyopen/novel/controller/front/UserController.java
@@ -1,5 +1,6 @@
 package io.github.xxyopen.novel.controller.front;
 
+import io.github.xxyopen.novel.core.auth.UserHolder;
 import io.github.xxyopen.novel.core.common.resp.RestResp;
 import io.github.xxyopen.novel.core.constant.ApiRouterConsts;
 import io.github.xxyopen.novel.core.constant.SystemConfigConsts;
@@ -9,6 +10,7 @@ import io.github.xxyopen.novel.dto.req.UserLoginReqDto;
 import io.github.xxyopen.novel.dto.req.UserRegisterReqDto;
 import io.github.xxyopen.novel.dto.resp.UserLoginRespDto;
 import io.github.xxyopen.novel.service.UserService;
+import jakarta.servlet.http.HttpServletRequest;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
@@ -49,8 +51,8 @@ public class UserController {
      * 用户信息修改接口
      */
     @PutMapping
-    public RestResp<Void> updateUserInfo(@Valid UserInfoUptReqDto dto, @RequestHeader("Authorization") String token) {
-        dto.setUserId(jwtUtils.parseToken(token, SystemConfigConsts.NOVEL_FRONT_KEY));
+    public RestResp<Void> updateUserInfo(@Valid UserInfoUptReqDto dto) {
+        dto.setUserId(UserHolder.getUserId());
         return userService.updateUserInfo(dto);
     }
 
@@ -58,8 +60,8 @@ public class UserController {
      * 用户反馈
      */
     @PostMapping("feedBack")
-    public RestResp<Void> submitFeedBack(String content, @RequestHeader("Authorization") String token) {
-        return userService.saveFeedBack(jwtUtils.parseToken(token, SystemConfigConsts.NOVEL_FRONT_KEY), content);
+    public RestResp<Void> submitFeedBack(String content) {
+        return userService.saveFeedBack(UserHolder.getUserId(), content);
     }
 
 }
diff --git a/src/main/java/io/github/xxyopen/novel/core/auth/AuthStrategy.java b/src/main/java/io/github/xxyopen/novel/core/auth/AuthStrategy.java
index e366284..75eec03 100644
--- a/src/main/java/io/github/xxyopen/novel/core/auth/AuthStrategy.java
+++ b/src/main/java/io/github/xxyopen/novel/core/auth/AuthStrategy.java
@@ -48,6 +48,9 @@ public interface AuthStrategy {
             // 用户不存在
             throw new BusinessException(ErrorCodeEnum.USER_ACCOUNT_NOT_EXIST);
         }
+        // 设置 userId 到当前线程
+        UserHolder.setUserId(userId);
+        // 返回 userId
         return userId;
     }
 }
diff --git a/src/main/java/io/github/xxyopen/novel/core/auth/AuthorAuthStrategy.java b/src/main/java/io/github/xxyopen/novel/core/auth/AuthorAuthStrategy.java
index 046b50a..95d851c 100644
--- a/src/main/java/io/github/xxyopen/novel/core/auth/AuthorAuthStrategy.java
+++ b/src/main/java/io/github/xxyopen/novel/core/auth/AuthorAuthStrategy.java
@@ -44,5 +44,8 @@ public class AuthorAuthStrategy implements AuthStrategy {
             // 作家账号不存在,无权访问作家专区
             throw new BusinessException(ErrorCodeEnum.USER_UN_AUTH);
         }
+
+        // 设置作家ID到当前线程
+        UserHolder.setAuthorId(authorInfo.getId());
     }
 }
\ No newline at end of file
diff --git a/src/main/java/io/github/xxyopen/novel/core/auth/UserHolder.java b/src/main/java/io/github/xxyopen/novel/core/auth/UserHolder.java
new file mode 100644
index 0000000..350d3db
--- /dev/null
+++ b/src/main/java/io/github/xxyopen/novel/core/auth/UserHolder.java
@@ -0,0 +1,45 @@
+package io.github.xxyopen.novel.core.auth;
+
+import lombok.experimental.UtilityClass;
+
+/**
+ * 用户信息 持有类
+ *
+ * @author xiongxiaoyang
+ * @date 2022/5/18
+ */
+@UtilityClass
+public class UserHolder {
+
+    /**
+     * 当前线程用户ID
+     * */
+    private static final ThreadLocal<Long> userIdTL = new ThreadLocal<>();
+
+    /**
+     * 当前线程作家ID
+     * */
+    private static final ThreadLocal<Long> authorIdTL = new ThreadLocal<>();
+
+    public void setUserId(Long userId) {
+        userIdTL.set(userId);
+    }
+
+    public Long getUserId() {
+        return userIdTL.get();
+    }
+
+    public void setAuthorId(Long authorId) {
+        authorIdTL.set(authorId);
+    }
+
+    public Long getAuthorId() {
+        return authorIdTL.get();
+    }
+
+    public void clear(){
+        userIdTL.remove();
+        authorIdTL.remove();
+    }
+
+}
diff --git a/src/main/java/io/github/xxyopen/novel/core/intercepter/AuthInterceptor.java b/src/main/java/io/github/xxyopen/novel/core/intercepter/AuthInterceptor.java
index 9b38de4..25beef3 100644
--- a/src/main/java/io/github/xxyopen/novel/core/intercepter/AuthInterceptor.java
+++ b/src/main/java/io/github/xxyopen/novel/core/intercepter/AuthInterceptor.java
@@ -2,6 +2,7 @@ package io.github.xxyopen.novel.core.intercepter;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import io.github.xxyopen.novel.core.auth.AuthStrategy;
+import io.github.xxyopen.novel.core.auth.UserHolder;
 import io.github.xxyopen.novel.core.common.constant.ErrorCodeEnum;
 import io.github.xxyopen.novel.core.common.exception.BusinessException;
 import io.github.xxyopen.novel.core.common.resp.RestResp;
@@ -10,9 +11,11 @@ import io.github.xxyopen.novel.core.constant.SystemConfigConsts;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
 
 import java.nio.charset.StandardCharsets;
 import java.util.Map;
@@ -49,15 +52,21 @@ public class AuthInterceptor implements HandlerInterceptor {
         // 开始认证
         try {
             authStrategy.get(authStrategyName).auth(token);
+            return HandlerInterceptor.super.preHandle(request, response, handler);
         }catch (BusinessException exception){
             // 认证失败
             response.setCharacterEncoding(StandardCharsets.UTF_8.name());
             response.setContentType(MediaType.APPLICATION_JSON_VALUE);
-            response.getWriter().write(objectMapper.writeValueAsString(RestResp.fail(ErrorCodeEnum.USER_LOGIN_EXPIRED)));
+            response.getWriter().write(objectMapper.writeValueAsString(RestResp.fail(exception.getErrorCodeEnum())));
             return false;
         }
-        // 认证成功
-        return HandlerInterceptor.super.preHandle(request, response, handler);
+    }
 
+    @SuppressWarnings("NullableProblems")
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+        // 清理当前线程保存的用户数据
+        UserHolder.clear();
+        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
     }
 }