新增 SaInterceptor 综合拦截器

This commit is contained in:
click33 2022-08-21 07:03:26 +08:00
parent 3f91fa4045
commit ffcad7da6f

View File

@ -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;
/**
* 认证函数每次请求执行
* <p> 参数路由处理函数指针
*/
public SaParamFunction<Object> auth = handler -> {};
/**
* 创建一个 Sa-Token 综合拦截器默认带有注解鉴权能力
*/
public SaInterceptor() {
}
/**
* 创建一个 Sa-Token 综合拦截器默认带有注解鉴权能力
* @param auth 认证函数每次请求执行
*/
public SaInterceptor(SaParamFunction<Object> auth) {
this.auth = auth;
}
/**
* 设置是否打开注解鉴权
* @param isAnnotation /
* @return 对象自身
*/
public SaInterceptor isAnnotation(boolean isAnnotation) {
this.isAnnotation = isAnnotation;
return this;
}
/**
* 写入[认证函数]: 每次请求执行
* @param auth /
* @return 对象自身
*/
public SaInterceptor setAuth(SaParamFunction<Object> 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;
}
}