From ffcad7da6f15488cd8ee5ea1d4ad7c2123d42ee8 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Sun, 21 Aug 2022 07:03:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20SaInterceptor=20=E7=BB=BC?= =?UTF-8?q?=E5=90=88=E6=8B=A6=E6=88=AA=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../satoken/interceptor/SaInterceptor.java | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaInterceptor.java 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 new file mode 100644 index 00000000..3889dffa --- /dev/null +++ b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaInterceptor.java @@ -0,0 +1,108 @@ +package cn.dev33.satoken.interceptor; + +import java.lang.reflect.Method; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import cn.dev33.satoken.exception.BackResultException; +import cn.dev33.satoken.exception.StopMatchException; +import cn.dev33.satoken.fun.SaParamFunction; +import cn.dev33.satoken.strategy.SaStrategy; + +/** + * Sa-Token 综合拦截器,提供注解鉴权和路由拦截鉴权能力 + * + * @author kong + * @since: 2022-8-21 + */ +public class SaInterceptor implements HandlerInterceptor { + + /** + * 是否打开注解鉴权 + */ + public boolean isAnnotation = true; + + + + + /** + * 认证函数:每次请求执行 + *

参数:路由处理函数指针 + */ + public SaParamFunction auth = handler -> {}; + + /** + * 创建一个 Sa-Token 综合拦截器,默认带有注解鉴权能力 + */ + public SaInterceptor() { + } + + /** + * 创建一个 Sa-Token 综合拦截器,默认带有注解鉴权能力 + * @param auth 认证函数,每次请求执行 + */ + public SaInterceptor(SaParamFunction auth) { + this.auth = auth; + } + + /** + * 设置是否打开注解鉴权 + * @param isAnnotation / + * @return 对象自身 + */ + public SaInterceptor isAnnotation(boolean isAnnotation) { + this.isAnnotation = isAnnotation; + return this; + } + + /** + * 写入[认证函数]: 每次请求执行 + * @param auth / + * @return 对象自身 + */ + public SaInterceptor setAuth(SaParamFunction auth) { + this.auth = auth; + return this; + } + + + // ----------------- 验证方法 ----------------- + + /** + * 每次请求之前触发的方法 + */ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) + throws Exception { + + try { + + // 获取此请求对应的 Method 处理函数 + if(handler instanceof HandlerMethod) { + Method method = ((HandlerMethod) handler).getMethod(); + SaStrategy.me.checkMethodAnnotation.accept(method); + } + + // Auth 校验 + auth.run(handler); + + } catch (StopMatchException e) { + // 停止匹配,进入Controller + } catch (BackResultException e) { + // 停止匹配,向前端输出结果 + if(response.getContentType() == null) { + response.setContentType("text/plain; charset=utf-8"); + } + response.getWriter().print(e.getMessage()); + return false; + } + + // 通过验证 + return true; + } + +}