From 80e7264afabb8ca5537bb2bb64a563dd3506e8e4 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <773861846@qq.com> Date: Fri, 27 May 2022 17:34:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20Token=20=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E6=8B=A6=E6=88=AA=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xxyopen/novel/core/config/WebConfig.java | 10 ++++- .../interceptor/TokenParseInterceptor.java | 43 +++++++++++++++++++ .../novel/service/impl/BookServiceImpl.java | 1 + 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/github/xxyopen/novel/core/interceptor/TokenParseInterceptor.java diff --git a/src/main/java/io/github/xxyopen/novel/core/config/WebConfig.java b/src/main/java/io/github/xxyopen/novel/core/config/WebConfig.java index 2bb0fae..58a06d4 100644 --- a/src/main/java/io/github/xxyopen/novel/core/config/WebConfig.java +++ b/src/main/java/io/github/xxyopen/novel/core/config/WebConfig.java @@ -4,6 +4,7 @@ import io.github.xxyopen.novel.core.constant.ApiRouterConsts; import io.github.xxyopen.novel.core.constant.SystemConfigConsts; import io.github.xxyopen.novel.core.interceptor.AuthInterceptor; import io.github.xxyopen.novel.core.interceptor.FileInterceptor; +import io.github.xxyopen.novel.core.interceptor.TokenParseInterceptor; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; @@ -25,6 +26,8 @@ public class WebConfig implements WebMvcConfigurer { private final FileInterceptor fileInterceptor; + private final TokenParseInterceptor tokenParseInterceptor; + @Override public void addInterceptors(InterceptorRegistry registry) { // 文件访问拦截 @@ -42,7 +45,12 @@ public class WebConfig implements WebMvcConfigurer { // 放行登录注册相关请求接口 .excludePathPatterns(ApiRouterConsts.API_FRONT_USER_URL_PREFIX + "/register" , ApiRouterConsts.API_FRONT_USER_URL_PREFIX + "/login" - ,ApiRouterConsts.API_ADMIN_URL_PREFIX + "/login"); + , ApiRouterConsts.API_ADMIN_URL_PREFIX + "/login"); + + // Token 解析拦截器 + registry.addInterceptor(tokenParseInterceptor) + // 拦截小说内容查询接口,需要解析 token 以判断该用户是否有权阅读该章节(付费章节是否已购买) + .addPathPatterns(ApiRouterConsts.API_FRONT_BOOK_URL_PREFIX + "/content/*"); } } diff --git a/src/main/java/io/github/xxyopen/novel/core/interceptor/TokenParseInterceptor.java b/src/main/java/io/github/xxyopen/novel/core/interceptor/TokenParseInterceptor.java new file mode 100644 index 0000000..15514cf --- /dev/null +++ b/src/main/java/io/github/xxyopen/novel/core/interceptor/TokenParseInterceptor.java @@ -0,0 +1,43 @@ +package io.github.xxyopen.novel.core.interceptor; + +import io.github.xxyopen.novel.core.auth.UserHolder; +import io.github.xxyopen.novel.core.constant.SystemConfigConsts; +import io.github.xxyopen.novel.core.util.JwtUtils; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +/** + * Token 解析拦截器 + * + * @author xiongxiaoyang + * @date 2022/5/27 + */ +@Component +@RequiredArgsConstructor +public class TokenParseInterceptor implements HandlerInterceptor { + + private final JwtUtils jwtUtils; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + // 获取登录 JWT + String token = request.getHeader(SystemConfigConsts.HTTP_AUTH_HEADER_NAME); + if (StringUtils.hasText(token)) { + // 解析 token 并保存 + UserHolder.setUserId(jwtUtils.parseToken(token, SystemConfigConsts.NOVEL_FRONT_KEY)); + } + return HandlerInterceptor.super.preHandle(request, response, handler); + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + // 清理当前线程保存的用户数据 + UserHolder.clear(); + HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); + } +} diff --git a/src/main/java/io/github/xxyopen/novel/service/impl/BookServiceImpl.java b/src/main/java/io/github/xxyopen/novel/service/impl/BookServiceImpl.java index ff694ba..c377cb0 100644 --- a/src/main/java/io/github/xxyopen/novel/service/impl/BookServiceImpl.java +++ b/src/main/java/io/github/xxyopen/novel/service/impl/BookServiceImpl.java @@ -346,6 +346,7 @@ public class BookServiceImpl implements BookService { @Override public RestResp getBookContentAbout(Long chapterId) { + log.debug("userId:{}",UserHolder.getUserId()); // 查询章节信息 BookChapterRespDto bookChapter = bookChapterCacheManager.getChapter(chapterId);