From bc3898bf3ebfe20f638dae925d8c1f46fe713594 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Thu, 11 May 2023 15:22:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20sa-token-spring-boot-start?= =?UTF-8?q?er=20=E6=A8=A1=E5=9D=97=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sa-token-doc/more/common-questions.md | 2 +- .../dev33/satoken/filter/SaServletFilter.java | 8 +++++-- .../satoken/interceptor/SaInterceptor.java | 23 +++++++++++-------- .../spring/SaTokenContextForSpring.java | 16 ++++++------- .../spring/SaTokenContextRegister.java | 10 ++++---- .../dev33/satoken/spring/SpringMVCUtil.java | 15 ++++++------ 6 files changed, 42 insertions(+), 32 deletions(-) diff --git a/sa-token-doc/more/common-questions.md b/sa-token-doc/more/common-questions.md index 6eb729fb..053979e0 100644 --- a/sa-token-doc/more/common-questions.md +++ b/sa-token-doc/more/common-questions.md @@ -9,7 +9,7 @@ ## 一、常见报错 -### Q:报错:非Web上下文无法获取Request。 +### Q:报错:非 web 上下文无法获取 HttpServletRequest。 报错原因解析: diff --git a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/filter/SaServletFilter.java b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/filter/SaServletFilter.java index 91247fb3..5159eec5 100644 --- a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/filter/SaServletFilter.java +++ b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/filter/SaServletFilter.java @@ -22,9 +22,13 @@ import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.util.SaTokenConsts; /** - * Servlet全局过滤器 - * @author click33 + * Servlet 全局鉴权过滤器 + *
+ * 默认优先级为 -100,尽量保证在其它过滤器之前执行 + *
* + * @author click33 + * @since <= 1.34.0 */ @Order(SaTokenConsts.ASSEMBLY_ORDER) public class SaServletFilter implements SaFilter, Filter { diff --git a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaInterceptor.java b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaInterceptor.java index 10737b66..6fcda9f3 100644 --- a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaInterceptor.java +++ b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaInterceptor.java @@ -23,7 +23,7 @@ import cn.dev33.satoken.strategy.SaStrategy; public class SaInterceptor implements HandlerInterceptor { /** - * 是否打开注解鉴权 + * 是否打开注解鉴权,配置为 true 时注解鉴权才会生效,配置为 false 时,即使写了注解也不会进行鉴权 */ public boolean isAnnotation = true; @@ -48,9 +48,9 @@ public class SaInterceptor implements HandlerInterceptor { } /** - * 设置是否打开注解鉴权 + * 设置是否打开注解鉴权:配置为 true 时注解鉴权才会生效,配置为 false 时,即使写了注解也不会进行鉴权 * @param isAnnotation / - * @return 对象自身 + * @return 对象自身 */ public SaInterceptor isAnnotation(boolean isAnnotation) { this.isAnnotation = isAnnotation; @@ -58,7 +58,7 @@ public class SaInterceptor implements HandlerInterceptor { } /** - * 写入[认证函数]: 每次请求执行 + * 写入 [ 认证函数 ]: 每次请求执行 * @param auth / * @return 对象自身 */ @@ -79,27 +79,32 @@ public class SaInterceptor implements HandlerInterceptor { try { + // 这里必须确保 handler 是 HandlerMethod 类型时,才能进行注解鉴权 if(isAnnotation && handler instanceof HandlerMethod) { // 获取此请求对应的 Method 处理函数 Method method = ((HandlerMethod) handler).getMethod(); - // 如果此 Method 或其所属 Class 标注了 @SaIgnore,则忽略掉鉴权 + // 如果此 Method 或其所属 Class 标注了 @SaIgnore,则忽略掉鉴权 if(SaStrategy.me.isAnnotationPresent.apply(method, SaIgnore.class)) { + // 注意这里直接就退出整个鉴权了,最底部的 auth.run() 路由拦截鉴权也被跳出了 return true; } - // 注解校验 + // 执行注解鉴权 SaStrategy.me.checkMethodAnnotation.accept(method); } - // Auth 校验 + // Auth 路由拦截鉴权校验 auth.run(handler); } catch (StopMatchException e) { - // 停止匹配,进入Controller + // StopMatchException 异常代表:停止匹配,进入Controller + } catch (BackResultException e) { - // 停止匹配,向前端输出结果 + // BackResultException 异常代表:停止匹配,向前端输出结果 + // 请注意此处默认 Content-Type 为 text/plain,如果需要返回 JSON 信息,需要在 back 前自行设置 Content-Type 为 application/json + // 例如:SaHolder.getResponse().setHeader("Content-Type", "application/json;charset=UTF-8"); if(response.getContentType() == null) { response.setContentType("text/plain; charset=utf-8"); } diff --git a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenContextForSpring.java b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenContextForSpring.java index 18420f4f..acc688b2 100644 --- a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenContextForSpring.java +++ b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenContextForSpring.java @@ -9,15 +9,15 @@ import cn.dev33.satoken.servlet.model.SaResponseForServlet; import cn.dev33.satoken.servlet.model.SaStorageForServlet; /** - * Sa-Token 上下文处理器 [ SpringMVC版本实现 ] + * Sa-Token 上下文处理器 [ SpringMVC版本实现 ]。在 SpringMVC、SpringBoot 中使用 Sa-Token 时,必须注入此实现类,否则会出现上下文无效异常 * * @author click33 - * + * @since <= 1.34.0 */ public class SaTokenContextForSpring implements SaTokenContext { /** - * 获取当前请求的Request对象 + * 获取当前请求的 Request 包装对象 */ @Override public SaRequest getRequest() { @@ -25,7 +25,7 @@ public class SaTokenContextForSpring implements SaTokenContext { } /** - * 获取当前请求的Response对象 + * 获取当前请求的 Response 包装对象 */ @Override public SaResponse getResponse() { @@ -33,15 +33,15 @@ public class SaTokenContextForSpring implements SaTokenContext { } /** - * 获取当前请求的 [存储器] 对象 + * 获取当前请求的 Storage 包装对象 */ @Override public SaStorage getStorage() { return new SaStorageForServlet(SpringMVCUtil.getRequest()); } - + /** - * 校验指定路由匹配符是否可以匹配成功指定路径 + * 判断:指定路由匹配符是否可以匹配成功指定路径 */ @Override public boolean matchPath(String pattern, String path) { @@ -49,7 +49,7 @@ public class SaTokenContextForSpring implements SaTokenContext { } /** - * 此上下文是否有效 + * 判断:在本次请求中,此上下文是否可用。 */ @Override public boolean isValid() { diff --git a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenContextRegister.java b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenContextRegister.java index ff5de17b..09c8c485 100644 --- a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenContextRegister.java +++ b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenContextRegister.java @@ -5,17 +5,17 @@ import org.springframework.context.annotation.Bean; import cn.dev33.satoken.context.SaTokenContext; /** - * 注册Sa-Token所需要的Bean - *Bean 的注册与注入应该分开在两个文件中,否则在某些场景下会造成循环依赖 - * @author click33 + * 注册 Sa-Token 框架所需要的 Bean * + * @author click33 + * @since <= 1.34.0 */ public class SaTokenContextRegister { /** - * 获取上下文Bean (Spring版) + * 获取上下文处理器组件 (Spring版) * - * @return 容器交互Bean (Spring版) + * @return / */ @Bean public SaTokenContext getSaTokenContextForSpring() { diff --git a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SpringMVCUtil.java b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SpringMVCUtil.java index be96c7d6..16050d90 100644 --- a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SpringMVCUtil.java +++ b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SpringMVCUtil.java @@ -10,9 +10,10 @@ import cn.dev33.satoken.error.SaSpringBootErrorCode; import cn.dev33.satoken.exception.NotWebContextException; /** - * SpringMVC相关操作 - * @author click33 + * SpringMVC 相关操作工具类,快速获取当前会话的 HttpServletRequest、HttpServletResponse 对象 * + * @author click33 + * @since <= 1.34.0 */ public class SpringMVCUtil { @@ -20,32 +21,32 @@ public class SpringMVCUtil { } /** - * 获取当前会话的 request + * 获取当前会话的 request 对象 * @return request */ public static HttpServletRequest getRequest() { ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if(servletRequestAttributes == null) { - throw new NotWebContextException("非Web上下文无法获取Request").setCode(SaSpringBootErrorCode.CODE_20101); + throw new NotWebContextException("非 web 上下文无法获取 HttpServletRequest").setCode(SaSpringBootErrorCode.CODE_20101); } return servletRequestAttributes.getRequest(); } /** - * 获取当前会话的 response + * 获取当前会话的 response 对象 * @return response */ public static HttpServletResponse getResponse() { ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if(servletRequestAttributes == null) { - throw new NotWebContextException("非Web上下文无法获取Response").setCode(SaSpringBootErrorCode.CODE_20101); + throw new NotWebContextException("非 web 上下文无法获取 HttpServletResponse").setCode(SaSpringBootErrorCode.CODE_20101); } return servletRequestAttributes.getResponse(); } /** * 判断当前是否处于 Web 上下文中 - * @return request + * @return / */ public static boolean isWeb() { return RequestContextHolder.getRequestAttributes() != null;