From cce907fd20afbc11d8f9f66af7f3d9061aa98f1f Mon Sep 17 00:00:00 2001 From: "zhaofeng\\zf" Date: Fri, 11 Feb 2022 15:27:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=9B=A0jfinal,jboot?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=BA=8F=E5=88=97=E5=8C=96=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E5=AF=BC=E8=87=B4=E7=9A=84=E4=B9=B1=E7=A0=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8?= =?UTF-8?q?SaJdkSerializer=E8=BF=9B=E8=A1=8C=E7=BC=93=E5=AD=98=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sa-token-jboot-plugin/pom.xml | 2 +- .../cn/dev33/satoken/jboot/SaJedisImpl.java | 15 +- .../cn/dev33/satoken/jboot/SaRedisConfig.java | 17 +- .../satoken/jboot/SaTokenContextForJboot.java | 2 +- .../satoken/jboot/SaTokenPathFilter.java | 154 ++++++++++++++++++ .../satoken/jboot/test/AtteStartListener.java | 22 ++- .../cn/dev33/satoken/jfinal/PathAnalyzer.java | 2 +- .../satoken/jfinal/SaTokenActionHandler.java | 1 + .../dev33/satoken/jfinal/SaTokenDaoRedis.java | 3 - .../cn/dev33/satoken/jfinal/test/Config.java | 27 ++- 10 files changed, 211 insertions(+), 34 deletions(-) create mode 100644 sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaTokenPathFilter.java diff --git a/sa-token-starter/sa-token-jboot-plugin/pom.xml b/sa-token-starter/sa-token-jboot-plugin/pom.xml index bcf033bb..37edaa66 100644 --- a/sa-token-starter/sa-token-jboot-plugin/pom.xml +++ b/sa-token-starter/sa-token-jboot-plugin/pom.xml @@ -5,7 +5,7 @@ sa-token-starter cn.dev33 - 1.28.0 + 1.29.0 4.0.0 jar diff --git a/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaJedisImpl.java b/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaJedisImpl.java index a720ed17..652aabd0 100644 --- a/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaJedisImpl.java +++ b/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaJedisImpl.java @@ -1,13 +1,11 @@ package cn.dev33.satoken.jboot; -import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.util.SaFoxUtil; import com.jfinal.log.Log; import io.jboot.Jboot; import io.jboot.components.serializer.JbootSerializer; import io.jboot.components.serializer.JbootSerializerManager; import io.jboot.exception.JbootIllegalConfigException; -import io.jboot.support.redis.JbootRedisBase; import io.jboot.utils.StrUtil; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; @@ -34,12 +32,13 @@ public class SaJedisImpl { serializer = JbootSerializerManager.me().getSerializer(config.getSerializer()); } this.config = config; - String host = config.getHost(); - Integer port = config.getPort(); - Integer timeout = config.getTimeout(); - String password = config.getPassword(); - Integer database = config.getDb()==null?config.getDatabase():config.getDb(); - String clientName = config.getClientName(); + assert this.config != null; + String host = this.config.getHost(); + Integer port = this.config.getPort(); + Integer timeout = this.config.getTimeout(); + String password = this.config.getPassword(); + Integer database = this.config.getSaDb()==null?this.config.getDatabase():this.config.getSaDb(); + String clientName = this.config.getClientName(); if (host.contains(":")) { port = Integer.valueOf(host.split(":")[1]); diff --git a/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaRedisConfig.java b/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaRedisConfig.java index fa7363a1..33dc56be 100644 --- a/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaRedisConfig.java +++ b/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaRedisConfig.java @@ -4,21 +4,24 @@ import io.jboot.app.config.annotation.ConfigModel; import io.jboot.support.redis.JbootRedisConfig; /** - * SA-Token redis缓存配置 + * SA-Token redis缓存配置,获取database */ @ConfigModel( - prefix = "sa.redis" + prefix = "jboot.redis" ) public class SaRedisConfig extends JbootRedisConfig{ - private Integer db; + private Integer saDb; - public Integer getDb() { - return this.db; + public SaRedisConfig(){ + + } + public Integer getSaDb() { + return this.saDb; } - public void setDb(Integer db) { - this.db = db; + public void setSaDb(Integer saDb) { + this.saDb = saDb; } } diff --git a/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaTokenContextForJboot.java b/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaTokenContextForJboot.java index 32879fff..457a5735 100644 --- a/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaTokenContextForJboot.java +++ b/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaTokenContextForJboot.java @@ -10,7 +10,7 @@ import cn.dev33.satoken.servlet.model.SaStorageForServlet; import io.jboot.web.controller.JbootControllerContext; /** - * Sa-Token 上下文处理器 [Jboot 版本实现] + * Sa-Token 上线文处理器 [Jboot 版本实现] */ public class SaTokenContextForJboot implements SaTokenContext { /** diff --git a/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaTokenPathFilter.java b/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaTokenPathFilter.java new file mode 100644 index 00000000..7e24ffa6 --- /dev/null +++ b/sa-token-starter/sa-token-jboot-plugin/src/main/java/cn/dev33/satoken/jboot/SaTokenPathFilter.java @@ -0,0 +1,154 @@ +package cn.dev33.satoken.jboot; + +import cn.dev33.satoken.exception.SaTokenException; +import cn.dev33.satoken.filter.SaFilterAuthStrategy; +import cn.dev33.satoken.filter.SaFilterErrorStrategy; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SaTokenPathFilter { + + // ------------------------ 设置此过滤器 拦截 & 放行 的路由 + + /** + * 拦截路由 + */ + private List includeList = new ArrayList<>(); + + /** + * 放行路由 + */ + private List excludeList = new ArrayList<>(); + + /** + * 添加 [拦截路由] + * @param paths 路由 + * @return 对象自身 + */ + public SaTokenPathFilter addInclude(String... paths) { + includeList.addAll(Arrays.asList(paths)); + return this; + } + + /** + * 添加 [放行路由] + * @param paths 路由 + * @return 对象自身 + */ + public SaTokenPathFilter addExclude(String... paths) { + excludeList.addAll(Arrays.asList(paths)); + return this; + } + + /** + * 写入 [拦截路由] 集合 + * @param pathList 路由集合 + * @return 对象自身 + */ + public SaTokenPathFilter setIncludeList(List pathList) { + includeList = pathList; + return this; + } + + /** + * 写入 [放行路由] 集合 + * @param pathList 路由集合 + * @return 对象自身 + */ + public SaTokenPathFilter setExcludeList(List pathList) { + excludeList = pathList; + return this; + } + + /** + * 获取 [拦截路由] 集合 + * @return see note + */ + public List getIncludeList() { + return includeList; + } + + /** + * 获取 [放行路由] 集合 + * @return see note + */ + public List getExcludeList() { + return excludeList; + } + + + // ------------------------ 钩子函数 + + /** + * 认证函数:每次请求执行 + */ + public SaFilterAuthStrategy auth = r -> {}; + + /** + * 异常处理函数:每次[认证函数]发生异常时执行此函数 + */ + public SaFilterErrorStrategy error = e -> { + throw new SaTokenException(e); + }; + + /** + * 前置函数:在每次[认证函数]之前执行 + */ + public SaFilterAuthStrategy beforeAuth = r -> {}; + + /** + * 写入[认证函数]: 每次请求执行 + * @param auth see note + * @return 对象自身 + */ + public SaTokenPathFilter setAuth(SaFilterAuthStrategy auth) { + this.auth = auth; + return this; + } + + /** + * 写入[异常处理函数]:每次[认证函数]发生异常时执行此函数 + * @param error see note + * @return 对象自身 + */ + public SaTokenPathFilter setError(SaFilterErrorStrategy error) { + this.error = error; + return this; + } + + /** + * 写入[前置函数]:在每次[认证函数]之前执行 + * @param beforeAuth see note + * @return 对象自身 + */ + public SaTokenPathFilter setBeforeAuth(SaFilterAuthStrategy beforeAuth) { + this.beforeAuth = beforeAuth; + return this; + } + + + /*@Override + public void doFilter(Controller ctx, FilterChain chain) throws Throwable { + try { + // 执行全局过滤器 + SaRouter.match(includeList).notMatch(excludeList).check(r -> { + beforeAuth.run(null); + auth.run(null); + }); + + } catch (StopMatchException e) { + + } catch (Throwable e) { + // 1. 获取异常处理策略结果 + String result = (e instanceof BackResultException) ? e.getMessage() : String.valueOf(error.run(e)); + // 2. 写入输出流 + ctx.renderText(result); + return; + } + + // 执行 + chain.doFilter(ctx); + }*/ +} diff --git a/sa-token-starter/sa-token-jboot-plugin/src/test/java/cn/dev33/satoken/jboot/test/AtteStartListener.java b/sa-token-starter/sa-token-jboot-plugin/src/test/java/cn/dev33/satoken/jboot/test/AtteStartListener.java index 88465900..64580ec0 100644 --- a/sa-token-starter/sa-token-jboot-plugin/src/test/java/cn/dev33/satoken/jboot/test/AtteStartListener.java +++ b/sa-token-starter/sa-token-jboot-plugin/src/test/java/cn/dev33/satoken/jboot/test/AtteStartListener.java @@ -1,27 +1,35 @@ package cn.dev33.satoken.jboot.test; import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.config.SaCookieConfig; +import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.context.SaTokenContext; +import cn.dev33.satoken.jboot.SaAnnotationInterceptor; +import cn.dev33.satoken.jboot.SaTokenContextForJboot; +import cn.dev33.satoken.jboot.SaTokenDaoRedis; +import cn.dev33.satoken.util.SaTokenConsts; import com.jfinal.config.Constants; import com.jfinal.config.Interceptors; import com.jfinal.config.Routes; import com.jfinal.template.Engine; -import cn.dev33.satoken.jboot.SaAnnotationInterceptor; -import cn.dev33.satoken.jboot.SaTokenContextForJboot; -import cn.dev33.satoken.jboot.SaTokenDaoRedis; import io.jboot.aop.jfinal.JfinalHandlers; import io.jboot.aop.jfinal.JfinalPlugins; import io.jboot.core.listener.JbootAppListener; public class AtteStartListener implements JbootAppListener { public void onInit() { - //注册权限验证功能,由saToken处理请求上下文 SaTokenContext saTokenContext = new SaTokenContextForJboot(); SaManager.setSaTokenContext(saTokenContext); - //加载权限角色设置数据接口 SaManager.setStpInterface(new StpInterfaceImpl()); - //增加redis缓存,需要先配置redis地址 -// SaManager.setSaTokenDao(new SaTokenDaoRedis()); + SaTokenConfig saTokenConfig = new SaTokenConfig(); + saTokenConfig.setTokenStyle(SaTokenConsts.TOKEN_STYLE_SIMPLE_UUID); + saTokenConfig.setTimeout(60*60*4); //登录有效时间4小时 + saTokenConfig.setActivityTimeout(30*60); //半小时无操作过期处理 + saTokenConfig.setIsShare(false); + saTokenConfig.setTokenName("token"); //更换satoken的名称 + saTokenConfig.setCookie(new SaCookieConfig().setHttpOnly(true)); //开启cookies的httponly属性 + SaManager.setConfig(saTokenConfig); + SaManager.setSaTokenDao(new SaTokenDaoRedis()); } @Override diff --git a/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/PathAnalyzer.java b/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/PathAnalyzer.java index d2305a07..257e50f2 100644 --- a/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/PathAnalyzer.java +++ b/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/PathAnalyzer.java @@ -42,7 +42,7 @@ public class PathAnalyzer { p = p.replace("$", "\\$"); p = p.replace("**", ".[]"); p = p.replace("*", "[^/]*"); - if (p.indexOf("{") >= 0) { + if (p.contains("{")) { if (p.indexOf("_}") > 0) { p = p.replaceAll("\\{[^\\}]+?\\_\\}", "(.+?)"); } diff --git a/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenActionHandler.java b/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenActionHandler.java index 56c9e903..a3553dc4 100644 --- a/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenActionHandler.java +++ b/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenActionHandler.java @@ -12,6 +12,7 @@ import com.jfinal.render.RenderManager; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + public class SaTokenActionHandler extends ActionHandler { protected boolean devMode; protected ActionMapping actionMapping; diff --git a/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenDaoRedis.java b/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenDaoRedis.java index b46e8b6f..6ea97aff 100644 --- a/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenDaoRedis.java +++ b/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenDaoRedis.java @@ -11,9 +11,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -/** - * 缓存处理类 - */ public class SaTokenDaoRedis implements SaTokenDao { protected Cache redis; diff --git a/sa-token-starter/sa-token-jfinal-plugin/src/test/java/cn/dev33/satoken/jfinal/test/Config.java b/sa-token-starter/sa-token-jfinal-plugin/src/test/java/cn/dev33/satoken/jfinal/test/Config.java index abe1b26f..edf9d288 100644 --- a/sa-token-starter/sa-token-jfinal-plugin/src/test/java/cn/dev33/satoken/jfinal/test/Config.java +++ b/sa-token-starter/sa-token-jfinal-plugin/src/test/java/cn/dev33/satoken/jfinal/test/Config.java @@ -1,10 +1,14 @@ package cn.dev33.satoken.jfinal.test; import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.config.SaCookieConfig; +import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.context.SaTokenContext; import cn.dev33.satoken.jfinal.*; +import cn.dev33.satoken.util.SaTokenConsts; import com.jfinal.config.*; import com.jfinal.plugin.redis.RedisPlugin; +import com.jfinal.plugin.redis.serializer.ISerializer; import com.jfinal.template.Engine; public class Config extends JFinalConfig { @@ -15,7 +19,17 @@ public class Config extends JFinalConfig { SaManager.setSaTokenContext(saTokenContext); //加载权限角色设置数据接口 SaManager.setStpInterface(new StpInterfaceImpl()); - + //设置token生成类型 + SaTokenConfig saTokenConfig = new SaTokenConfig(); + saTokenConfig.setTokenStyle(SaTokenConsts.TOKEN_STYLE_SIMPLE_UUID); + saTokenConfig.setTimeout(60*60*4); //登录有效时间4小时 + saTokenConfig.setActivityTimeout(30*60); //半小时无操作过期处理 + saTokenConfig.setIsShare(false); + saTokenConfig.setTokenName("token"); //更改satoken的cookies名称 + SaCookieConfig saCookieConfig = new SaCookieConfig(); + saCookieConfig.setHttpOnly(true); //开启cookies 的httponly属性 + saTokenConfig.setCookie(saCookieConfig); + SaManager.setConfig(saTokenConfig); } @Override @@ -37,7 +51,7 @@ public class Config extends JFinalConfig { @Override public void configPlugin(Plugins plugins) { //添加redis扩展 -// plugins.add(createRedisPlugin("satoken",10)); + plugins.add(createRedisPlugin("satoken",1, SaJdkSerializer.me)); } @Override @@ -56,16 +70,17 @@ public class Config extends JFinalConfig { * 创建Redis插件 * @param name 名称 * @param dbIndex 使用的库ID + * @param serializer 自定义序列化方法 * @return */ - private RedisPlugin createRedisPlugin(String name, Integer dbIndex) { - RedisPlugin redisPlugin=new RedisPlugin(name, "redis-host", 6379, 3000,"pwd",dbIndex); - redisPlugin.setSerializer(SaJdkSerializer.me); + private RedisPlugin createRedisPlugin(String name, Integer dbIndex, ISerializer serializer) { + RedisPlugin redisPlugin = new RedisPlugin(name, "redis-host", 6379, 3000,"pwd",dbIndex); + redisPlugin.setSerializer(serializer); return redisPlugin; } @Override public void onStart(){ //增加redis缓存,需要先配置redis地址 -// SaManager.setSaTokenDao(new SaTokenDaoRedis("satoken")); + SaManager.setSaTokenDao(new SaTokenDaoRedis("satoken")); } }