From 26ee628b3311c80216ddddffb9c6069633c9a17a Mon Sep 17 00:00:00 2001 From: shengzhang <2393584716@qq.com> Date: Sat, 30 Jan 2021 18:06:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=BA=90=E7=A0=81=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/SaTokenActionDefaultImpl.java | 15 +- .../dev33/satoken/config/SaTokenConfig.java | 128 ++++++------- .../satoken/config/SaTokenConfigFactory.java | 163 ++++++++-------- .../dev33/satoken/cookie/SaTokenCookie.java | 29 +-- .../cookie/SaTokenCookieDefaultImpl.java | 11 +- .../satoken/cookie/SaTokenCookieUtil.java | 27 +-- .../satoken/dao/SaTokenDaoDefaultImpl.java | 2 +- .../satoken/exception/NotLoginException.java | 17 +- .../exception/NotPermissionException.java | 37 ++-- .../satoken/exception/NotRoleException.java | 38 ++-- .../satoken/exception/SaTokenException.java | 27 +-- .../cn/dev33/satoken/fun/IsRunFunction.java | 23 ++- .../java/cn/dev33/satoken/fun/SaFunction.java | 5 +- .../dev33/satoken/servlet/SaTokenServlet.java | 15 +- .../servlet/SaTokenServletDefaultImpl.java | 16 +- .../cn/dev33/satoken/session/SaSession.java | 181 +++++++++--------- .../satoken/session/SaSessionCustomUtil.java | 49 ++--- .../cn/dev33/satoken/session/TokenSign.java | 50 +++-- .../cn/dev33/satoken/stp/SaTokenInfo.java | 82 ++++---- .../cn/dev33/satoken/stp/StpInterface.java | 24 +-- .../satoken/stp/StpInterfaceDefaultImpl.java | 5 +- .../java/cn/dev33/satoken/stp/StpLogic.java | 104 +++++----- .../java/cn/dev33/satoken/stp/StpUtil.java | 2 +- .../cn/dev33/satoken/util/SaTaskUtil.java | 3 + .../cn/dev33/satoken/util/SaTokenConsts.java | 46 ++++- .../dev33/satoken/util/SaTokenInsideUtil.java | 74 ++++--- .../satoken/dao/SaTokenDaoRedisJackson.java | 11 +- .../cn/dev33/satoken/dao/SaTokenDaoRedis.java | 13 +- .../cn/dev33/satoken/aop/SaCheckAspect.java | 23 +-- .../autowired/SaTokenSpringAutowired.java | 82 ++++---- .../interceptor/SaAnnotationInterceptor.java | 33 ++-- .../satoken/interceptor/SaRouteFunction.java | 10 +- .../satoken/interceptor/SaRouterUtil.java | 2 +- .../spring/SaTokenServletSpringImpl.java | 9 +- .../dev33/satoken/spring/SpringMVCUtil.java | 10 +- 35 files changed, 717 insertions(+), 649 deletions(-) diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java index f0a48ecf..0f5def46 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java @@ -3,6 +3,7 @@ package cn.dev33.satoken.action; import java.util.UUID; import cn.dev33.satoken.SaTokenManager; +import cn.dev33.satoken.util.SaTokenConsts; import cn.dev33.satoken.util.SaTokenInsideUtil; /** @@ -21,30 +22,30 @@ public class SaTokenActionDefaultImpl implements SaTokenAction { // 根据配置的tokenStyle生成不同风格的token String tokenStyle = SaTokenManager.getConfig().getTokenStyle(); // uuid - if("uuid".equals(tokenStyle)) { + if(SaTokenConsts.TOKEN_STYLE_UUID.equals(tokenStyle)) { return UUID.randomUUID().toString(); } // 简单uuid (不带下划线) - if("simple-uuid".equals(tokenStyle)) { + if(SaTokenConsts.TOKEN_STYLE_SIMPLE_UUID.equals(tokenStyle)) { return UUID.randomUUID().toString().replaceAll("-", ""); } // 32位随机字符串 - if("random-32".equals(tokenStyle)) { + if(SaTokenConsts.TOKEN_STYLE_RANDOM_32.equals(tokenStyle)) { return SaTokenInsideUtil.getRandomString(32); } // 64位随机字符串 - if("random-64".equals(tokenStyle)) { + if(SaTokenConsts.TOKEN_STYLE_RANDOM_64.equals(tokenStyle)) { return SaTokenInsideUtil.getRandomString(64); } // 128位随机字符串 - if("random-128".equals(tokenStyle)) { + if(SaTokenConsts.TOKEN_STYLE_RANDOM_128.equals(tokenStyle)) { return SaTokenInsideUtil.getRandomString(128); } // tik风格 (2_14_16) - if("tik".equals(tokenStyle)) { + if(SaTokenConsts.TOKEN_STYLE_RANDOM_TIK.equals(tokenStyle)) { return SaTokenInsideUtil.getRandomString(2) + "_" + SaTokenInsideUtil.getRandomString(14) + "_" + SaTokenInsideUtil.getRandomString(16) + "__"; } - // 默认,还是uuid + // 默认,还是uuid return UUID.randomUUID().toString(); } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java index c2bee7dd..06abe2b6 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java @@ -1,220 +1,226 @@ package cn.dev33.satoken.config; /** - * sa-token 配置类 Model - *

你可以通过yml、properties、java代码等形式配置本类参数,具体请查阅官方文档 + * sa-token 配置类 Model + *

+ * 你可以通过yml、properties、java代码等形式配置本类参数,具体请查阅官方文档: http://sa-token.dev33.cn/ + * * @author kong * */ public class SaTokenConfig { /** token名称 (同时也是cookie名称) */ - private String tokenName = "satoken"; - + private String tokenName = "satoken"; + /** token的长久有效期(单位:秒) 默认30天, -1代表永久 */ - private long timeout = 30 * 24 * 60 * 60; - - /** token临时有效期 [指定时间内无操作就视为token过期] (单位/秒), 默认-1 代表不限制 (例如可以设置为1800代表30分钟内无操作就过期) */ - private long activityTimeout = -1; - - /** 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) */ - private Boolean allowConcurrentLogin = true; - - /** 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) */ - private Boolean isShare = true; - + private long timeout = 30 * 24 * 60 * 60; + + /** + * token临时有效期 [指定时间内无操作就视为token过期] (单位: 秒), 默认-1 代表不限制 + * (例如可以设置为1800代表30分钟内无操作就过期) + */ + private long activityTimeout = -1; + + /** 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) */ + private Boolean allowConcurrentLogin = true; + + /** 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) */ + private Boolean isShare = true; + /** 是否尝试从请求体里读取token */ - private Boolean isReadBody = true; - + private Boolean isReadBody = true; + /** 是否尝试从header里读取token */ - private Boolean isReadHead = true; - + private Boolean isReadHead = true; + /** 是否尝试从cookie里读取token */ - private Boolean isReadCookie = true; - + private Boolean isReadCookie = true; + /** token风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) */ - private String tokenStyle = "uuid"; + private String tokenStyle = "uuid"; /** 默认dao层实现类中,每次清理过期数据间隔的时间 (单位: 秒) ,默认值30秒,设置为-1代表不启动定时清理 */ private int dataRefreshPeriod = 30; - + /** 获取[token专属session]时是否必须登录 (如果配置为true,会在每次获取[token-session]时校验是否登录) */ - private Boolean tokenSessionCheckLogin = true; - + private Boolean tokenSessionCheckLogin = true; + /** 是否在初始化配置时打印版本字符画 */ private Boolean isV = true; - /** - * @return tokenName + * @return token名称 (同时也是cookie名称) */ public String getTokenName() { return tokenName; } /** - * @param tokenName 要设置的 tokenName + * @param tokenName token名称 (同时也是cookie名称) */ public void setTokenName(String tokenName) { this.tokenName = tokenName; } /** - * @return timeout + * @return token的长久有效期(单位:秒) 默认30天, -1代表永久 */ public long getTimeout() { return timeout; } /** - * @param timeout 要设置的 timeout + * @param timeout token的长久有效期(单位:秒) 默认30天, -1代表永久 */ public void setTimeout(long timeout) { this.timeout = timeout; } /** - * @return activityTimeout + * @return token临时有效期 [指定时间内无操作就视为token过期] (单位: 秒), 默认-1 代表不限制 + * (例如可以设置为1800代表30分钟内无操作就过期) */ public long getActivityTimeout() { return activityTimeout; } /** - * @param activityTimeout 要设置的 activityTimeout + * @param activityTimeout token临时有效期 [指定时间内无操作就视为token过期] (单位: 秒), 默认-1 代表不限制 + * (例如可以设置为1800代表30分钟内无操作就过期) */ public void setActivityTimeout(long activityTimeout) { this.activityTimeout = activityTimeout; } /** - * @return allowConcurrentLogin + * @return 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) */ public Boolean getAllowConcurrentLogin() { return allowConcurrentLogin; } /** - * @param allowConcurrentLogin 要设置的 allowConcurrentLogin + * @param allowConcurrentLogin 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) */ public void setAllowConcurrentLogin(Boolean allowConcurrentLogin) { this.allowConcurrentLogin = allowConcurrentLogin; } /** - * @return isShare + * @return 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) */ public Boolean getIsShare() { return isShare; } /** - * @param isShare 要设置的 isShare + * @param 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) */ public void setIsShare(Boolean isShare) { this.isShare = isShare; } /** - * @return isReadBody + * @return 是否尝试从请求体里读取token */ public Boolean getIsReadBody() { return isReadBody; } /** - * @param isReadBody 要设置的 isReadBody + * @param isReadBody 是否尝试从请求体里读取token */ public void setIsReadBody(Boolean isReadBody) { this.isReadBody = isReadBody; } /** - * @return isReadHead + * @return 是否尝试从header里读取token */ public Boolean getIsReadHead() { return isReadHead; } /** - * @param isReadHead 要设置的 isReadHead + * @param 是否尝试从header里读取token */ public void setIsReadHead(Boolean isReadHead) { this.isReadHead = isReadHead; } /** - * @return isReadCookie + * @return 是否尝试从cookie里读取token */ public Boolean getIsReadCookie() { return isReadCookie; } /** - * @param isReadCookie 要设置的 isReadCookie + * @param 是否尝试从cookie里读取token */ public void setIsReadCookie(Boolean isReadCookie) { this.isReadCookie = isReadCookie; } /** - * @return tokenStyle + * @return token风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) */ public String getTokenStyle() { return tokenStyle; } /** - * @param tokenStyle 要设置的 tokenStyle + * @param token风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) */ public void setTokenStyle(String tokenStyle) { this.tokenStyle = tokenStyle; } /** - * @return dataRefreshPeriod + * @return 默认dao层实现类中,每次清理过期数据间隔的时间 (单位: 秒) ,默认值30秒,设置为-1代表不启动定时清理 */ public int getDataRefreshPeriod() { return dataRefreshPeriod; } /** - * @param dataRefreshPeriod 要设置的 dataRefreshPeriod + * @param dataRefreshPeriod 默认dao层实现类中,每次清理过期数据间隔的时间 (单位: 秒) + * ,默认值30秒,设置为-1代表不启动定时清理 */ public void setDataRefreshPeriod(int dataRefreshPeriod) { this.dataRefreshPeriod = dataRefreshPeriod; } /** - * @return tokenSessionCheckLogin + * @return 获取[token专属session]时是否必须登录 (如果配置为true,会在每次获取[token-session]时校验是否登录) */ public Boolean getTokenSessionCheckLogin() { return tokenSessionCheckLogin; } /** - * @param tokenSessionCheckLogin 要设置的 tokenSessionCheckLogin + * @param tokenSessionCheckLogin 获取[token专属session]时是否必须登录 + * (如果配置为true,会在每次获取[token-session]时校验是否登录) */ public void setTokenSessionCheckLogin(Boolean tokenSessionCheckLogin) { this.tokenSessionCheckLogin = tokenSessionCheckLogin; } /** - * @return isV + * @return 是否在初始化配置时打印版本字符画 */ public Boolean getIsV() { return isV; } /** - * @param isV 要设置的 isV + * @param isV 是否在初始化配置时打印版本字符画 */ public void setIsV(Boolean isV) { this.isV = isV; } - - @Override public String toString() { return "SaTokenConfig [tokenName=" + tokenName + ", timeout=" + timeout + ", activityTimeout=" + activityTimeout @@ -224,22 +230,4 @@ public class SaTokenConfig { + tokenSessionCheckLogin + ", isV=" + isV + "]"; } - - - - - - - - - - - - - - - - - - } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java index b29cf151..fb2f1d1e 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java @@ -8,44 +8,46 @@ import java.util.Map; import java.util.Properties; /** - * sa-token配置文件创建工厂类 + * sa-token配置文件的构建工厂类 + *

+ * 只有在非IOC环境下才会用到此类 + * * @author kong * */ public class SaTokenConfigFactory { - /** - * 默认配置文件地址 + * 配置文件地址 */ public static String configPath = "sa-token.properties"; /** - * 根据指定路径获取配置信息 - * @return 一个SaTokenConfig对象 + * 根据configPath路径获取配置信息 + * + * @return 一个SaTokenConfig对象 */ public static SaTokenConfig createConfig() { Map map = readPropToMap(configPath); - if(map == null){ + if (map == null) { // throw new RuntimeException("找不到配置文件:" + configPath, null); } - return (SaTokenConfig)initPropByMap(map, new SaTokenConfig()); + return (SaTokenConfig) initPropByMap(map, new SaTokenConfig()); } - - /** - * 将指定路径的properties配置文件读取到Map中 + * 工具方法: 将指定路径的properties配置文件读取到Map中 + * * @param propertiesPath 配置文件地址 * @return 一个Map */ - private static Map readPropToMap(String propertiesPath){ - Map map = new HashMap(); + private static Map readPropToMap(String propertiesPath) { + Map map = new HashMap(16); try { - InputStream is = SaTokenConfigFactory.class.getClassLoader().getResourceAsStream(propertiesPath); - if(is == null){ - return null; - } + InputStream is = SaTokenConfigFactory.class.getClassLoader().getResourceAsStream(propertiesPath); + if (is == null) { + return null; + } Properties prop = new Properties(); prop.load(is); for (String key : prop.stringPropertyNames()) { @@ -55,38 +57,41 @@ public class SaTokenConfigFactory { throw new RuntimeException("配置文件(" + propertiesPath + ")加载失败", e); } return map; - } - - - /** - * 将 Map 的值映射到 Model 上 - * @param map 属性集合 - * @param obj 对象,或类型 - * @return 返回实例化后的对象 - */ - private static Object initPropByMap(Map map, Object obj){ - - if(map == null){ - map = new HashMap(); - } - - // 1、取出类型 - Class cs = null; - if(obj instanceof Class){ // 如果是一个类型,则将obj=null,以便完成静态属性反射赋值 - cs = (Class)obj; - obj = null; - }else{ // 如果是一个对象,则取出其类型 - cs = obj.getClass(); - } - - // 2、遍历类型属性,反射赋值 - for (Field field : cs.getDeclaredFields()) { + } + + /** + * 工具方法: 将 Map 的值映射到一个 Model 上 + * + * @param map 属性集合 + * @param obj 对象, 或类型 + * @return 返回实例化后的对象 + */ + private static Object initPropByMap(Map map, Object obj) { + + if (map == null) { + map = new HashMap(16); + } + + // 1、取出类型 + Class cs = null; + if (obj instanceof Class) { + // 如果是一个类型,则将obj=null,以便完成静态属性反射赋值 + cs = (Class) obj; + obj = null; + } else { + // 如果是一个对象,则取出其类型 + cs = obj.getClass(); + } + + // 2、遍历类型属性,反射赋值 + for (Field field : cs.getDeclaredFields()) { String value = map.get(field.getName()); if (value == null) { - continue; // 如果为空代表没有配置此项 + // 如果为空代表没有配置此项 + continue; } try { - Object valueConvert = getObjectByClass(value, field.getType()); // 转换值类型 + Object valueConvert = getObjectByClass(value, field.getType()); field.setAccessible(true); field.set(obj, valueConvert); } catch (IllegalArgumentException e) { @@ -95,41 +100,39 @@ public class SaTokenConfigFactory { throw new RuntimeException("属性赋值出错:" + field.getName(), e); } } - return obj; - } - - /** - * 将字符串转化为指定数据类型 - * @param str 值 - * @param cs 要转换的类型 - * @return 转化好的结果 - */ - @SuppressWarnings("unchecked") - private static T getObjectByClass(String str, Class cs){ - Object value = null; - if(str == null){ - value = null; - }else if (cs.equals(String.class)) { - value = str; - } else if (cs.equals(int.class)||cs.equals(Integer.class)) { - value = new Integer(str); - } else if (cs.equals(long.class)||cs.equals(Long.class)) { - value = new Long(str); - } else if (cs.equals(short.class)||cs.equals(Short.class)) { - value = new Short(str); - } else if (cs.equals(float.class)||cs.equals(Float.class)) { - value = new Float(str); - } else if (cs.equals(double.class)||cs.equals(Double.class)) { - value = new Double(str); - } else if (cs.equals(boolean.class)||cs.equals(Boolean.class)) { - value = new Boolean(str); - }else{ - throw new RuntimeException("未能将值:" + str + ",转换类型为:" + cs, null); - } - return (T)value; + return obj; } - - - - + + /** + * 工具方法: 将字符串转化为指定数据类型 + * + * @param str 值 + * @param cs 要转换的类型 + * @return 转化好的结果 + */ + @SuppressWarnings("unchecked") + private static T getObjectByClass(String str, Class cs) { + Object value = null; + if (str == null) { + value = null; + } else if (cs.equals(String.class)) { + value = str; + } else if (cs.equals(int.class) || cs.equals(Integer.class)) { + value = new Integer(str); + } else if (cs.equals(long.class) || cs.equals(Long.class)) { + value = new Long(str); + } else if (cs.equals(short.class) || cs.equals(Short.class)) { + value = new Short(str); + } else if (cs.equals(float.class) || cs.equals(Float.class)) { + value = new Float(str); + } else if (cs.equals(double.class) || cs.equals(Double.class)) { + value = new Double(str); + } else if (cs.equals(boolean.class) || cs.equals(Boolean.class)) { + value = new Boolean(str); + } else { + throw new RuntimeException("未能将值:" + str + ",转换类型为:" + cs, null); + } + return (T) value; + } + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/cookie/SaTokenCookie.java b/sa-token-core/src/main/java/cn/dev33/satoken/cookie/SaTokenCookie.java index c9b9c3e4..a68fe456 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/cookie/SaTokenCookie.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/cookie/SaTokenCookie.java @@ -5,7 +5,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** - * sa-token 对cookie的相关操作 接口类 + * sa-token 对cookie的相关操作 接口类 + * * @author kong * */ @@ -13,36 +14,40 @@ public interface SaTokenCookie { /** * 在request对象中获取指定Cookie - * @param request request对象 - * @param cookieName Cookie名称 + * + * @param request request对象 + * @param cookieName Cookie名称 * @return 查找到的Cookie对象 */ public Cookie getCookie(HttpServletRequest request, String cookieName); /** * 添加Cookie - * @param response response对象 - * @param name Cookie名称 - * @param value Cookie值 - * @param path Cookie路径 + * + * @param response response对象 + * @param name Cookie名称 + * @param value Cookie值 + * @param path Cookie路径 * @param timeout 过期时间 (秒) */ public void addCookie(HttpServletResponse response, String name, String value, String path, int timeout); /** * 删除Cookie - * @param request request对象 - * @param response response对象 + * + * @param request request对象 + * @param response response对象 * @param name Cookie名称 */ public void delCookie(HttpServletRequest request, HttpServletResponse response, String name); /** * 修改Cookie的value值 - * @param request request对象 + * + * @param request request对象 * @param response response对象 - * @param name Cookie名称 - * @param value Cookie值 + * @param name Cookie名称 + * @param value Cookie值 */ public void updateCookie(HttpServletRequest request, HttpServletResponse response, String name, String value); diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/cookie/SaTokenCookieDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/cookie/SaTokenCookieDefaultImpl.java index c0836221..4240ab6a 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/cookie/SaTokenCookieDefaultImpl.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/cookie/SaTokenCookieDefaultImpl.java @@ -5,14 +5,15 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** - * sa-token 对cookie的相关操作 接口实现类 + * sa-token 对cookie的相关操作 接口实现类 + * * @author kong * */ public class SaTokenCookieDefaultImpl implements SaTokenCookie { /** - * 获取指定cookie + * 获取指定cookie */ @Override public Cookie getCookie(HttpServletRequest request, String cookieName) { @@ -20,7 +21,7 @@ public class SaTokenCookieDefaultImpl implements SaTokenCookie { } /** - * 添加cookie + * 添加cookie */ @Override public void addCookie(HttpServletResponse response, String name, String value, String path, int timeout) { @@ -28,7 +29,7 @@ public class SaTokenCookieDefaultImpl implements SaTokenCookie { } /** - * 删除cookie + * 删除cookie */ @Override public void delCookie(HttpServletRequest request, HttpServletResponse response, String name) { @@ -36,7 +37,7 @@ public class SaTokenCookieDefaultImpl implements SaTokenCookie { } /** - * 修改cookie的value值 + * 修改cookie的value值 */ @Override public void updateCookie(HttpServletRequest request, HttpServletResponse response, String name, String value) { diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/cookie/SaTokenCookieUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/cookie/SaTokenCookieUtil.java index e77ff321..51dbaf5e 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/cookie/SaTokenCookieUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/cookie/SaTokenCookieUtil.java @@ -5,15 +5,17 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** - * Cookie操作工具类 - * @author kong + * Cookie操作工具类 + * + * @author kong */ public class SaTokenCookieUtil { /** * 在request对象中获取指定Cookie - * @param request request对象 - * @param cookieName Cookie名称 + * + * @param request request对象 + * @param cookieName Cookie名称 * @return 查找到的Cookie对象 */ public static Cookie getCookie(HttpServletRequest request, String cookieName) { @@ -30,11 +32,12 @@ public class SaTokenCookieUtil { /** * 添加cookie + * * @param response response - * @param name Cookie名称 + * @param name Cookie名称 * @param value Cookie值 * @param path Cookie写入路径 - * @param timeout Cookie有效期 (秒) + * @param timeout Cookie有效期 (秒) */ public static void addCookie(HttpServletResponse response, String name, String value, String path, int timeout) { Cookie cookie = new Cookie(name, value); @@ -48,9 +51,10 @@ public class SaTokenCookieUtil { /** * 删除Cookie + * * @param request request对象 * @param response response对象 - * @param name Cookie名称 + * @param name Cookie名称 */ public static void delCookie(HttpServletRequest request, HttpServletResponse response, String name) { Cookie[] cookies = request.getCookies(); @@ -66,10 +70,11 @@ public class SaTokenCookieUtil { /** * 修改cookie的value值 - * @param request request对象 - * @param response response对象 - * @param name Cookie名称 - * @param value Cookie值 + * + * @param request request对象 + * @param response response对象 + * @param name Cookie名称 + * @param value Cookie值 */ public static void updateCookie(HttpServletRequest request, HttpServletResponse response, String name, String value) { diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java index c5206c7c..7ad286bd 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java @@ -22,7 +22,7 @@ public class SaTokenDaoDefaultImpl implements SaTokenDao { /** - * 所有数据集合 + * 数据集合 */ public Map dataMap = new ConcurrentHashMap(); diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotLoginException.java b/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotLoginException.java index a66839d5..afa36aee 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotLoginException.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotLoginException.java @@ -10,7 +10,7 @@ import java.util.List; public class NotLoginException extends RuntimeException { /** - * + * 序列化版本号 */ private static final long serialVersionUID = 6806129545290130142L; @@ -56,6 +56,7 @@ public class NotLoginException extends RuntimeException { * 异常类型 */ private String type; + /** * 获取异常类型 * @return 异常类型 @@ -69,6 +70,7 @@ public class NotLoginException extends RuntimeException { * loginKey */ private String loginKey; + /** * 获得loginKey * @return loginKey @@ -78,8 +80,6 @@ public class NotLoginException extends RuntimeException { } - - /** * 构造方法创建一个 * @param message 异常消息 @@ -87,7 +87,6 @@ public class NotLoginException extends RuntimeException { * @param type 类型 */ public NotLoginException(String message, String loginKey, String type) { - // 这里到底要不要拼接上login_key呢?纠结 super(message); this.loginKey = loginKey; this.type = type; @@ -101,19 +100,19 @@ public class NotLoginException extends RuntimeException { */ public static NotLoginException newInstance(String loginKey, String type) { String message = null; - if(type.equals(NOT_TOKEN)) { + if(NOT_TOKEN.equals(type)) { message = NOT_TOKEN_MESSAGE; } - else if(type.equals(INVALID_TOKEN)) { + else if(INVALID_TOKEN.equals(type)) { message = INVALID_TOKEN_MESSAGE; } - else if(type.equals(TOKEN_TIMEOUT)) { + else if(TOKEN_TIMEOUT.equals(type)) { message = TOKEN_TIMEOUT_MESSAGE; } - else if(type.equals(BE_REPLACED)) { + else if(BE_REPLACED.equals(type)) { message = BE_REPLACED_MESSAGE; } - else if(type.equals(KICK_OUT)) { + else if(KICK_OUT.equals(type)) { message = KICK_OUT_MESSAGE; } else { diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java b/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java index 56d0ac4f..472ef0b7 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java @@ -4,48 +4,49 @@ import cn.dev33.satoken.stp.StpUtil; /** * 没有指定权限码,抛出的异常 + * * @author kong * */ public class NotPermissionException extends RuntimeException { /** - * + * 序列化版本号 */ private static final long serialVersionUID = 6806129545290130142L; - + /** 权限码 */ private String code; - + /** - * @return 获得权限码 + * @return 获得权限码 */ public String getCode() { return code; } - + /** - * loginKey + * loginKey */ private String loginKey; - /** - * 获得loginKey - * @return loginKey + + /** + * 获得loginKey + * + * @return loginKey */ public String getLoginKey() { return loginKey; } - public NotPermissionException(String code) { - this(code, StpUtil.stpLogic.loginKey); - } - public NotPermissionException(String code, String loginKey) { - // 这里到底要不要拼接上loginKey呢?纠结 - super("无此权限:" + code); - this.code = code; - this.loginKey = loginKey; - } + this(code, StpUtil.stpLogic.loginKey); + } + public NotPermissionException(String code, String loginKey) { + super("无此权限:" + code); + this.code = code; + this.loginKey = loginKey; + } } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotRoleException.java b/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotRoleException.java index 3d11b763..9cbd18c5 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotRoleException.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotRoleException.java @@ -4,48 +4,50 @@ import cn.dev33.satoken.stp.StpUtil; /** * 没有指定角色标识,抛出的异常 + * * @author kong * */ public class NotRoleException extends RuntimeException { - + /** - * + * 序列化版本号 */ private static final long serialVersionUID = 8243974276159004739L; - + /** 角色标识 */ private String role; - + /** - * @return 获得角色标识 + * @return 获得角色标识 */ public String getRole() { return role; } - + /** - * loginKey + * loginKey */ private String loginKey; - /** - * 获得loginKey - * @return loginKey + + /** + * 获得loginKey + * + * @return loginKey */ public String getLoginKey() { return loginKey; } - public NotRoleException(String role) { - this(role, StpUtil.stpLogic.loginKey); - } + this(role, StpUtil.stpLogic.loginKey); + } + public NotRoleException(String role, String loginKey) { // 这里到底要不要拼接上loginKey呢?纠结 - super("无此角色:" + role); - this.role = role; - this.loginKey = loginKey; - } - + super("无此角色:" + role); + this.role = role; + this.loginKey = loginKey; + } } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenException.java b/sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenException.java index 00e77255..8f5ee1b8 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenException.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenException.java @@ -1,33 +1,34 @@ package cn.dev33.satoken.exception; /** - * sa-token框架内部逻辑发生错误抛出的异常 + * sa-token框架内部逻辑发生错误抛出的异常 (自定义此异常可方便开发者在做全局异常处理时分辨异常类型) + * * @author kong * */ public class SaTokenException extends RuntimeException { - + /** - * + * 序列化版本号 */ private static final long serialVersionUID = 6806129545290130132L; - /** - * 构建一个异常 - * @param message 异常描述信息 + * 构建一个异常 + * + * @param message 异常描述信息 */ public SaTokenException(String message) { - super(message); - } + super(message); + } /** - * 构建一个异常 - * @param cause 异常对象 + * 构建一个异常 + * + * @param cause 异常对象 */ public SaTokenException(Throwable cause) { - super(cause); - } - + super(cause); + } } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/fun/IsRunFunction.java b/sa-token-core/src/main/java/cn/dev33/satoken/fun/IsRunFunction.java index 64c3b866..8321c2cc 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/fun/IsRunFunction.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/fun/IsRunFunction.java @@ -1,33 +1,36 @@ package cn.dev33.satoken.fun; /** - * 根据boolean变量,决定是否执行一个函数 + * 根据boolean变量,决定是否执行一个函数 + * * @author kong * */ public class IsRunFunction { /** - * 变量 + * 变量 */ - public Boolean isRun; - + public final Boolean isRun; + /** - * 设定一个变量,如果为true,则执行exe函数 + * 设定一个变量,如果为true,则执行exe函数 + * * @param isRun 变量 */ public IsRunFunction(boolean isRun) { this.isRun = isRun; } - + /** - * 根据变量决定是否执行此函数 - * @param function 函数 + * 根据变量决定是否执行此函数 + * + * @param function 函数 */ public void exe(SaFunction function) { - if(isRun) { + if (isRun) { function.run(); } } - + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/fun/SaFunction.java b/sa-token-core/src/main/java/cn/dev33/satoken/fun/SaFunction.java index 5fd967c1..6b0d2190 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/fun/SaFunction.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/fun/SaFunction.java @@ -1,14 +1,15 @@ package cn.dev33.satoken.fun; /** - * 模拟身份方法的辅助类 + * 设定一个函数,方便在Lambda表达式下的函数式编程 + * * @author kong * */ public interface SaFunction { /** - * 执行的方法 + * 执行的方法 */ public void run(); diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/servlet/SaTokenServlet.java b/sa-token-core/src/main/java/cn/dev33/satoken/servlet/SaTokenServlet.java index b1dbe6f7..a169c5d9 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/servlet/SaTokenServlet.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/servlet/SaTokenServlet.java @@ -4,24 +4,25 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** - * Servlet相关操作 + * Servlet相关操作接口 + * * @author kong * */ public interface SaTokenServlet { - /** - * 获取当前请求的 Request 对象 + * 获取当前请求的 Request 对象 + * * @return 当前请求的Request对象 */ public HttpServletRequest getRequest(); - + /** - * 获取当前请求的 Response 对象 + * 获取当前请求的 Response 对象 + * * @return 当前请求的response对象 */ public HttpServletResponse getResponse(); - - + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/servlet/SaTokenServletDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/servlet/SaTokenServletDefaultImpl.java index f3f205a0..f6fce841 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/servlet/SaTokenServletDefaultImpl.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/servlet/SaTokenServletDefaultImpl.java @@ -3,28 +3,30 @@ package cn.dev33.satoken.servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import cn.dev33.satoken.exception.SaTokenException; + /** - * sa-token 对SaTokenServlet接口默认实现类 + * sa-token 对SaTokenServlet接口默认实现类 + * * @author kong * */ public class SaTokenServletDefaultImpl implements SaTokenServlet { /** - * 获取当前请求的Request对象 + * 获取当前请求的Request对象 */ @Override public HttpServletRequest getRequest() { - throw new RuntimeException("请实现SaTokenServlet接口后进行Servlet相关操作"); + throw new SaTokenException("请实现SaTokenServlet接口后进行Servlet相关操作"); } - /** - * 获取当前请求的Response对象 + * 获取当前请求的Response对象 */ @Override public HttpServletResponse getResponse() { - throw new RuntimeException("请实现SaTokenServlet接口后进行Servlet相关操作"); + throw new SaTokenException("请实现SaTokenServlet接口后进行Servlet相关操作"); } - + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java b/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java index 958eaf0c..9dcabfab 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java @@ -9,213 +9,222 @@ import java.util.concurrent.ConcurrentHashMap; import cn.dev33.satoken.SaTokenManager; - /** - * session会话 + * Session Model + * * @author kong * */ public class SaSession implements Serializable { private static final long serialVersionUID = 1L; - - /** 此会话的id */ - private String id; - - /** 此会话的创建时间 */ + + /** 此Session的id */ + private String id; + + /** 此Session的创建时间 */ private long createTime; - - /** 此会话的所有数据 */ + + /** 此Session的所有挂载数据 */ private Map dataMap = new ConcurrentHashMap(); /** - * 构建一个 session对象 + * 构建一个Session对象 */ - public SaSession() {} - - /** - * 构建一个 session对象 - * @param id session的id - */ - public SaSession(String id) { - this.id = id; - this.createTime = System.currentTimeMillis(); + public SaSession() { } - - /** - * 获取此会话id - * @return 此会话的id - */ + + /** + * 构建一个Session对象 + * + * @param id Session的id + */ + public SaSession(String id) { + this.id = id; + this.createTime = System.currentTimeMillis(); + } + + /** + * 获取此会话id + * + * @return 此会话的id + */ public String getId() { return id; } /** - * 返回当前会话创建时间 + * 返回当前会话创建时间 + * * @return 时间戳 */ public long getCreateTime() { return createTime; } - - // ----------------------- tokenSign相关 - + // ----------------------- TokenSign相关 + /** - * 本session绑定的token签名列表 + * 此Session绑定的token签名列表 */ private List tokenSignList = new Vector(); - + /** - * 返回token签名列表 + * 返回token签名列表的拷贝副本 + * * @return token签名列表 */ public List getTokenSignList() { return new Vector<>(tokenSignList); } - + /** - * 查找一个token签名 - * @param tokenValue token值 + * 查找一个token签名 + * + * @param tokenValue token值 * @return 查找到的tokenSign */ public TokenSign getTokenSign(String tokenValue) { for (TokenSign tokenSign : getTokenSignList()) { - if(tokenSign.getValue().equals(tokenValue)){ - return tokenSign; - } + if (tokenSign.getValue().equals(tokenValue)) { + return tokenSign; + } } return null; } + /** * 添加一个token签名 + * * @param tokenSign token签名 */ public void addTokenSign(TokenSign tokenSign) { - // 如果已经存在于列表中,则无需再次添加 + // 如果已经存在于列表中,则无需再次添加 for (TokenSign tokenSign2 : getTokenSignList()) { - if(tokenSign2.getValue().equals(tokenSign.getValue())){ - return; - } + if (tokenSign2.getValue().equals(tokenSign.getValue())) { + return; + } } - // 添加并更新 + // 添加并更新 tokenSignList.add(tokenSign); update(); } + /** * 移除一个token签名 - * @param tokenValue token名称 + * + * @param tokenValue token名称 */ public void removeTokenSign(String tokenValue) { TokenSign tokenSign = getTokenSign(tokenValue); - if(tokenSignList.remove(tokenSign)) { + if (tokenSignList.remove(tokenSign)) { update(); } } - - - - - - // ----------------------- 存取值 - + + // ----------------------- 存取值 + /** - * 写入一个值 - * @param key 名称 - * @param value 值 + * 写入一个值 + * + * @param key 名称 + * @param value 值 */ public void setAttribute(String key, Object value) { dataMap.put(key, value); update(); } - + /** - * 取出一个值 + * 取出一个值 + * * @param key 名称 - * @return 值 + * @return 值 */ public Object getAttribute(String key) { return dataMap.get(key); } - + /** - * 取值,并指定取不到值时的默认值 - * @param key 名称 - * @param defaultValue 取不到值的时候返回的默认值 + * 取值,并指定取不到值时的默认值 + * + * @param key 名称 + * @param defaultValue 取不到值的时候返回的默认值 * @return value */ public Object getAttribute(String key, Object defaultValue) { Object value = getAttribute(key); - if(value != null) { + if (value != null) { return value; } return defaultValue; } /** - * 移除一个值 + * 移除一个值 + * * @param key 要移除的值的名字 */ public void removeAttribute(String key) { dataMap.remove(key); update(); } - + /** - * 清空所有值 + * 清空所有值 */ public void clearAttribute() { dataMap.clear(); update(); } - + /** - * 是否含有指定key - * @param key 是否含有指定值 - * @return 是否含有 + * 是否含有指定key + * + * @param key 是否含有指定值 + * @return 是否含有 */ - public boolean containsAttribute(String key) { + public boolean containsAttribute(String key) { return dataMap.keySet().contains(key); } - + /** - * 返回当前session会话所有key - * @return 所有值的key列表 + * 返回当前session会话所有key + * + * @return 所有值的key列表 */ public Set attributeKeys() { return dataMap.keySet(); } /** - * 获取数据集合(如果更新map里的值,请调用session.update()方法避免数据过时 ) - * @return 返回底层储存值的map对象 + * 获取数据挂载集合(如果更新map里的值,请调用session.update()方法避免产生脏数据 ) + * + * @return 返回底层储存值的map对象 */ public Map getDataMap() { return dataMap; } - - - - // ----------------------- 一些操作 - + + // ----------------------- 一些操作 + /** - * 将这个session从持久库更新一下 + * 将这个Session从持久库更新一下 */ public void update() { SaTokenManager.getSaTokenDao().updateSession(this); } - /** 注销会话(注销后,此session会话将不再存储服务器上) */ + /** 注销会话 (注销后,此session会话将不再存储服务器上) */ public void logout() { SaTokenManager.getSaTokenDao().deleteSession(this.id); } - /** 如果这个token的tokenSign数量为零,则直接注销会话 */ + /** 当Session上的tokenSign数量为零时,注销会话 */ public void logoutByTokenSignCountToZero() { - if(tokenSignList.size() == 0) { + if (tokenSignList.size() == 0) { logout(); } } - - + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java index a4336720..c2f8e5e7 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java @@ -3,68 +3,71 @@ package cn.dev33.satoken.session; import cn.dev33.satoken.SaTokenManager; /** - * 自定义sa-session工具类 + * 自定义Session工具类 + * * @author kong * */ public class SaSessionCustomUtil { /** - * 添加上指定前缀,防止恶意伪造session + * 添加上指定前缀,防止恶意伪造session */ public static String sessionKey = "custom"; /** - * 组织一下自定义session的id + * 组织一下自定义Session的id + * * @param sessionId 会话id * @return sessionId */ public static String getSessionKey(String sessionId) { return SaTokenManager.getConfig().getTokenName() + ":" + sessionKey + ":session:" + sessionId; } - - - /** - * 指定key的session是否存在 + + /** + * 验证指定key的Session是否存在 + * * @param sessionId session的id - * @return 是否存在 + * @return 是否存在 */ public boolean isExists(String sessionId) { return SaTokenManager.getSaTokenDao().getSession(getSessionKey(sessionId)) != null; } - - /** - * 获取指定key的session + + /** + * 获取指定key的Session + * * @param sessionId key - * @param isCreate 如果没有,是否新建并返回 + * @param isCreate 如果此Session尚未在DB创建,是否新建并返回 * @return SaSession */ public static SaSession getSessionById(String sessionId, boolean isCreate) { SaSession session = SaTokenManager.getSaTokenDao().getSession(getSessionKey(sessionId)); - if(session == null && isCreate) { + if (session == null && isCreate) { session = new SaSession(getSessionKey(sessionId)); SaTokenManager.getSaTokenDao().saveSession(session, SaTokenManager.getConfig().getTimeout()); } return session; } - - /** - * 获取指定key的session, 如果没有则新建并返回 + + /** + * 获取指定key的Session, 如果此Session尚未在DB创建,则新建并返回 + * * @param sessionId key - * @return session对象 + * @return session对象 */ public static SaSession getSessionById(String sessionId) { return getSessionById(sessionId, true); } - /** - * 删除指定key的session - * @param sessionId 删除指定key + /** + * 删除指定key的session + * + * @param sessionId 指定key */ public static void deleteSessionById(String sessionId) { SaTokenManager.getSaTokenDao().deleteSession(getSessionKey(sessionId)); } - - - + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/session/TokenSign.java b/sa-token-core/src/main/java/cn/dev33/satoken/session/TokenSign.java index c9f6e813..aeead4eb 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/session/TokenSign.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/session/TokenSign.java @@ -3,66 +3,62 @@ package cn.dev33.satoken.session; import java.io.Serializable; /** - * 挂在到SaSession上的token签名 + * token签名 Model + * + * 挂在到SaSession上的token签名 + * * @author kong * */ public class TokenSign implements Serializable { - + /** * */ private static final long serialVersionUID = 1406115065849845073L; /** - * token值 + * token值 */ private String value; - + /** - * 所在设备标识 + * 所在设备标识 */ private String device; - /** 构建一个 */ - public TokenSign() {} - - /** - * 构建一个 - * @param value token值 - * @param device 所在设备标识 - */ - public TokenSign(String value, String device) { - this.value = value; - this.device = device; + public TokenSign() { } - /** - * @return value + * 构建一个 + * + * @param value token值 + * @param device 所在设备标识 + */ + public TokenSign(String value, String device) { + this.value = value; + this.device = device; + } + + /** + * @return token value */ public String getValue() { return value; } /** - * @return device + * @return token登录设备 */ public String getDevice() { return device; } - - - - @Override public String toString() { return "TokenSign [value=" + value + ", device=" + device + "]"; } - - - - + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaTokenInfo.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaTokenInfo.java index 66a8ec13..f76e98a8 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaTokenInfo.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaTokenInfo.java @@ -1,7 +1,8 @@ package cn.dev33.satoken.stp; /** - * 用来描述一个token常用信息的类 + * token信息Model: 用来描述一个token的常用参数 + * * @author kong * */ @@ -13,177 +14,173 @@ public class SaTokenInfo { /** token值 */ public String tokenValue; - /** 当前是否已经登录 */ + /** 此token是否已经登录 */ public Boolean isLogin; - /** 当前loginId,未登录时为null */ + /** 此token对应的LoginId,未登录时为null */ public Object loginId; - /** 当前loginKey */ + /** LoginKey账号体系标识 */ public String loginKey; /** token剩余有效期 (单位: 秒) */ public long tokenTimeout; - /** session剩余有效时间 (单位: 秒) */ + /** User-Session剩余有效时间 (单位: 秒) */ public long sessionTimeout; - /** token专属session剩余有效时间 (单位: 秒) */ + /** Token-Session剩余有效时间 (单位: 秒) */ public long tokenSessionTimeout; - - /** - * token剩余无操作有效时间 - */ + + /** token剩余无操作有效时间 (单位: 秒) */ public long tokenActivityTimeout; - /** 当前登录设备 */ + /** 登录设备标识 */ public String loginDevice; - - /** - * @return tokenName + * @return token名称 */ public String getTokenName() { return tokenName; } /** - * @param tokenName 要设置的 tokenName + * @param tokenName token名称 */ public void setTokenName(String tokenName) { this.tokenName = tokenName; } /** - * @return tokenValue + * @return token值 */ public String getTokenValue() { return tokenValue; } /** - * @param tokenValue 要设置的 tokenValue + * @param tokenValue token值 */ public void setTokenValue(String tokenValue) { this.tokenValue = tokenValue; } /** - * @return isLogin + * @return 此token是否已经登录 */ public Boolean getIsLogin() { return isLogin; } /** - * @param isLogin 要设置的 isLogin + * @param isLogin 此token是否已经登录 */ public void setIsLogin(Boolean isLogin) { this.isLogin = isLogin; } /** - * @return loginId + * @return 此token对应的LoginId,未登录时为null */ public Object getLoginId() { return loginId; } /** - * @param loginId 要设置的 loginId + * @param loginId 此token对应的LoginId,未登录时为null */ public void setLoginId(Object loginId) { this.loginId = loginId; } /** - * @return loginKey + * @return LoginKey账号体系标识 */ public String getLoginKey() { return loginKey; } /** - * @param loginKey 要设置的 loginKey + * @param loginKey LoginKey账号体系标识 */ public void setLoginKey(String loginKey) { this.loginKey = loginKey; } /** - * @return tokenTimeout + * @return token剩余有效期 (单位: 秒) */ public long getTokenTimeout() { return tokenTimeout; } /** - * @param tokenTimeout 要设置的 tokenTimeout + * @param tokenTimeout token剩余有效期 (单位: 秒) */ public void setTokenTimeout(long tokenTimeout) { this.tokenTimeout = tokenTimeout; } /** - * @return sessionTimeout + * @return User-Session剩余有效时间 (单位: 秒) */ public long getSessionTimeout() { return sessionTimeout; } /** - * @param sessionTimeout 要设置的 sessionTimeout + * @param sessionTimeout User-Session剩余有效时间 (单位: 秒) */ public void setSessionTimeout(long sessionTimeout) { this.sessionTimeout = sessionTimeout; } /** - * @return tokenSessionTimeout + * @return Token-Session剩余有效时间 (单位: 秒) */ public long getTokenSessionTimeout() { return tokenSessionTimeout; } /** - * @param tokenSessionTimeout 要设置的 tokenSessionTimeout + * @param tokenSessionTimeout Token-Session剩余有效时间 (单位: 秒) */ public void setTokenSessionTimeout(long tokenSessionTimeout) { this.tokenSessionTimeout = tokenSessionTimeout; } /** - * @return tokenActivityTimeout + * @return token剩余无操作有效时间 (单位: 秒) */ public long getTokenActivityTimeout() { return tokenActivityTimeout; } /** - * @param tokenActivityTimeout 要设置的 tokenActivityTimeout + * @param tokenActivityTimeout token剩余无操作有效时间 (单位: 秒) */ public void setTokenActivityTimeout(long tokenActivityTimeout) { this.tokenActivityTimeout = tokenActivityTimeout; } /** - * @return loginDevice + * @return 登录设备标识 */ public String getLoginDevice() { return loginDevice; } /** - * @param loginDevice 要设置的 loginDevice + * @param loginDevice 登录设备标识 */ public void setLoginDevice(String loginDevice) { this.loginDevice = loginDevice; } - - - + /** + * toString + */ @Override public String toString() { return "SaTokenInfo [tokenName=" + tokenName + ", tokenValue=" + tokenValue + ", isLogin=" + isLogin @@ -191,18 +188,5 @@ public class SaTokenInfo { + ", sessionTimeout=" + sessionTimeout + ", tokenSessionTimeout=" + tokenSessionTimeout + ", tokenActivityTimeout=" + tokenActivityTimeout + ", loginDevice=" + loginDevice + "]"; } - - - - - - - - - - - - - } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterface.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterface.java index 8c6f3ac2..dd104b1e 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterface.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterface.java @@ -3,26 +3,28 @@ package cn.dev33.satoken.stp; import java.util.List; /** - * 开放权限验证接口,方便重写 + * 权限认证接口,实现此接口即可集成权限认证功能 + * * @author kong */ public interface StpInterface { - + /** - * 返回指定loginId所拥有的权限码集合 - * @param loginId 账号id - * @param loginKey 具体的stp标识 - * @return 该账号id具有的权限码集合 + * 返回指定 LoginId 所拥有的权限码集合 + * + * @param loginId 账号id + * @param loginKey 账号体系标识 + * @return 该账号id具有的权限码集合 */ public List getPermissionList(Object loginId, String loginKey); /** * 返回指定loginId所拥有的角色标识集合 - * @param loginId 账号id - * @param loginKey 具体的stp标识 - * @return 该账号id具有的角色标识集合 + * + * @param loginId 账号id + * @param loginKey 账号体系标识 + * @return 该账号id具有的角色标识集合 */ public List getRoleList(Object loginId, String loginKey); - - + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java index c2ee5486..504c8752 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java @@ -4,7 +4,10 @@ import java.util.ArrayList; import java.util.List; /** - * 对StpInterface接口默认的实现类 + * 对StpInterface接口默认的实现类 + *

+ * 如果开发者没有实现StpInterface接口,则使用此默认实现 + * * @author kong */ public class StpInterfaceDefaultImpl implements StpInterface { diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java index d280a95c..b1da3049 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java @@ -38,15 +38,15 @@ public class StpLogic { public String loginKey = ""; /** - * 初始化StpLogic, 并制定loginKey - * @param loginKey 账号标识 + * 初始化StpLogic, 并指定LoginKey + * @param loginKey 账号体系标识 */ public StpLogic(String loginKey) { this.loginKey = loginKey; } /** - * 获取当前StpLogin的loginKey + * 获取当前StpLogin的LoginKey * @return 当前StpLogin的loginKey */ public String getLoginKey(){ @@ -54,7 +54,7 @@ public class StpLogic { } /** - * 写入当前StpLogin的loginKey + * 写入当前StpLogin的LoginKey * @param loginKey loginKey * @return 对象自身 */ @@ -75,17 +75,16 @@ public class StpLogic { } /** - * 随机生成一个tokenValue + * 创建一个tokenValue * @param loginId loginId * @return 生成的tokenValue */ public String createTokenValue(Object loginId) { - // 去除掉所有逗号 - return SaTokenManager.getSaTokenAction().createToken(loginId, loginKey).replaceAll(",", ""); + return SaTokenManager.getSaTokenAction().createToken(loginId, loginKey); } /** - * 获取当前tokenValue + * 获取当前tokenValue * @return 当前tokenValue */ public String getTokenValue(){ @@ -100,15 +99,15 @@ public class StpLogic { tokenValue = String.valueOf(request.getAttribute(getKeyJustCreatedSave())); } // 2. 尝试从请求体里面读取 - if(tokenValue == null && config.getIsReadBody() == true){ + if(tokenValue == null && config.getIsReadBody()){ tokenValue = request.getParameter(keyTokenName); } // 3. 尝试从header里读取 - if(tokenValue == null && config.getIsReadHead() == true){ + if(tokenValue == null && config.getIsReadHead()){ tokenValue = request.getHeader(keyTokenName); } // 4. 尝试从cookie里读取 - if(tokenValue == null && config.getIsReadCookie() == true){ + if(tokenValue == null && config.getIsReadCookie()){ Cookie cookie = SaTokenManager.getSaTokenCookie().getCookie(request, keyTokenName); if(cookie != null){ tokenValue = cookie.getValue(); @@ -156,7 +155,6 @@ public class StpLogic { */ public void setLoginId(Object loginId, String device) { - // ------ 1、获取相应对象 HttpServletRequest request = SaTokenManager.getSaTokenServlet().getRequest(); SaTokenConfig config = getConfig(); @@ -166,7 +164,7 @@ public class StpLogic { String tokenValue = null; // --- 如果允许并发登录 if(config.getAllowConcurrentLogin() == true) { - // 如果配置为共享token, 则尝试从session签名记录里取出token + // 如果配置为共享token, 则尝试从Session签名记录里取出token if(config.getIsShare() == true) { tokenValue = getTokenValueByLoginId(loginId, device); } @@ -178,19 +176,22 @@ public class StpLogic { List tokenSignList = session.getTokenSignList(); for (TokenSign tokenSign : tokenSignList) { if(tokenSign.getDevice().equals(device)) { - dao.updateValue(getKeyTokenValue(tokenSign.getValue()), NotLoginException.BE_REPLACED); // 1. 将此token 标记为已顶替 - clearLastActivity(tokenSign.getValue()); // 2. 清理掉[token-最后操作时间] - session.removeTokenSign(tokenSign.getValue()); // 3. 清理账号session上的token签名记录 + // 1. 将此token 标记为已顶替 + dao.updateValue(getKeyTokenValue(tokenSign.getValue()), NotLoginException.BE_REPLACED); + // 2. 清理掉[token-最后操作时间] + clearLastActivity(tokenSign.getValue()); + // 3. 清理账号session上的token签名记录 + session.removeTokenSign(tokenSign.getValue()); } } } } - // 如果至此,仍未成功创建tokenValue + // 如果至此,仍未成功创建tokenValue, 则开始生成一个 if(tokenValue == null) { tokenValue = createTokenValue(loginId); } - // ------ 3. 获取[id-session] (如果还没有创建session, 则新建, 如果已经创建,则续期) + // ------ 3. 获取[User-Session] (如果还没有创建session, 则新建, 如果已经创建,则续期) SaSession session = getSessionByLoginId(loginId, false); if(session == null) { session = getSessionByLoginId(loginId); @@ -201,10 +202,14 @@ public class StpLogic { session.addTokenSign(new TokenSign(tokenValue, device)); // ------ 4. 持久化其它数据 - dao.setValue(getKeyTokenValue(tokenValue), String.valueOf(loginId), config.getTimeout()); // token -> uid - request.setAttribute(getKeyJustCreatedSave(), tokenValue); // 将token保存到本次request里 - setLastActivityToNow(tokenValue); // 写入 [最后操作时间] - if(config.getIsReadCookie() == true){ // cookie注入 + // token -> uid + dao.setValue(getKeyTokenValue(tokenValue), String.valueOf(loginId), config.getTimeout()); + // 将token保存到本次request里 + request.setAttribute(getKeyJustCreatedSave(), tokenValue); + // 写入 [最后操作时间] + setLastActivityToNow(tokenValue); + // cookie注入 + if(config.getIsReadCookie() == true){ SaTokenManager.getSaTokenCookie().addCookie(SaTokenManager.getSaTokenServlet().getResponse(), getTokenName(), tokenValue, "/", (int)config.getTimeout()); } } @@ -240,14 +245,14 @@ public class StpLogic { } SaTokenManager.getSaTokenDao().deleteKey(getKeyTokenValue(tokenValue)); - // 2. 尝试清理账号session上的token签名 (如果为null或已被标记为异常, 那么无需继续执行 ) + // 3. 尝试清理账号session上的token签名 (如果为null或已被标记为异常, 那么无需继续执行 ) SaSession session = getSessionByLoginId(loginId, false); if(session == null) { return; } session.removeTokenSign(tokenValue); - // 3. 尝试注销session + // 4. 尝试注销session session.logoutByTokenSignCountToZero(); } @@ -267,13 +272,13 @@ public class StpLogic { * @param device 设备标识 (填null代表所有注销设备) */ public void logoutByLoginId(Object loginId, String device) { - // 先获取这个账号的[id-session], 如果为null,则不执行任何操作 + // 1. 先获取这个账号的[id-session], 如果为null,则不执行任何操作 SaSession session = getSessionByLoginId(loginId); if(session == null) { return; } - // 循环token签名列表,开始删除相关信息 + // 2. 循环token签名列表,开始删除相关信息 List tokenSignList = session.getTokenSignList(); for (TokenSign tokenSign : tokenSignList) { if(device == null || tokenSign.getDevice().equals(device)) { @@ -282,12 +287,12 @@ public class StpLogic { // 2. 清理掉[token-最后操作时间] clearLastActivity(tokenValue); // 3. 标记:已被踢下线 - SaTokenManager.getSaTokenDao().updateValue(getKeyTokenValue(tokenValue), NotLoginException.KICK_OUT); // 标记:已被踢下线 + SaTokenManager.getSaTokenDao().updateValue(getKeyTokenValue(tokenValue), NotLoginException.KICK_OUT); // 4. 清理账号session上的token签名 session.removeTokenSign(tokenValue); } } - // 尝试注销session + // 3. 尝试注销session session.logoutByTokenSignCountToZero(); } @@ -314,16 +319,16 @@ public class StpLogic { * @return 账号id */ public Object getLoginId() { - // 如果正在[临时身份切换] + // 如果正在[临时身份切换], 则返回临时身份 if(isSwitch()) { return getSwitchLoginId(); } - // 如果获取不到token,则抛出:无token + // 如果获取不到token,则抛出: 无token String tokenValue = getTokenValue(); if(tokenValue == null) { throw NotLoginException.newInstance(loginKey, NotLoginException.NOT_TOKEN); } - // 查找此token对应loginId, 则抛出:无效token + // 查找此token对应loginId, 如果找不到则抛出:无效token String loginId = getLoginIdNotHandle(tokenValue); if(loginId == null) { throw NotLoginException.newInstance(loginKey, NotLoginException.INVALID_TOKEN); @@ -336,14 +341,14 @@ public class StpLogic { if(loginId.equals(NotLoginException.BE_REPLACED)) { throw NotLoginException.newInstance(loginKey, NotLoginException.BE_REPLACED); } - // 如果是已经被踢下线了, 则抛出:已被踢下线 + // 如果是已经被踢下线了, 则抛出:已被踢下线 if(loginId.equals(NotLoginException.KICK_OUT)) { throw NotLoginException.newInstance(loginKey, NotLoginException.KICK_OUT); } // 检查是否已经 [临时过期],同时更新[最后操作时间] checkActivityTimeout(tokenValue); updateLastActivityToNow(tokenValue); - // 至此,返回loginId + // 至此,返回loginId return loginId; } @@ -387,7 +392,7 @@ public class StpLogic { if(tokenValue == null) { return null; } - // loginId为null或者在异常项里面,均视为未登录 + // loginId为null或者在异常项里面,均视为未登录, 返回null Object loginId = getLoginIdNotHandle(tokenValue); if(loginId == null || NotLoginException.ABNORMAL_LIST.contains(loginId)) { return null; @@ -413,10 +418,6 @@ public class StpLogic { * @return 账号id */ public int getLoginIdAsInt() { - // Object loginId = getLoginId(); -// if(loginId instanceof Integer) { -// return (Integer)loginId; -// } return Integer.valueOf(String.valueOf(getLoginId())); } @@ -425,10 +426,6 @@ public class StpLogic { * @return 账号id */ public long getLoginIdAsLong() { -// Object loginId = getLoginId(); -// if(loginId instanceof Long) { -// return (Long)loginId; -// } return Long.valueOf(String.valueOf(getLoginId())); } @@ -553,11 +550,14 @@ public class StpLogic { // 如果配置忽略token登录校验,则必须保证token不为null (token为null的时候随机创建一个) String tokenValue = getTokenValue(); if(tokenValue == null || Objects.equals(tokenValue, "")) { - // 随机一个token送给ta + // 随机一个token送给Ta tokenValue = createTokenValue(null); + // Request做上标记 SaTokenManager.getSaTokenServlet().getRequest().setAttribute(getKeyJustCreatedSave(), tokenValue); - setLastActivityToNow(tokenValue); // 写入 [最后操作时间] - if(getConfig().getIsReadCookie() == true){ // cookie注入 + // 写入 [最后操作时间] + setLastActivityToNow(tokenValue); + // cookie注入 + if(getConfig().getIsReadCookie() == true){ SaTokenManager.getSaTokenCookie().addCookie(SaTokenManager.getSaTokenServlet().getResponse(), getTokenName(), tokenValue, "/", (int)getConfig().getTimeout()); } } @@ -801,7 +801,7 @@ public class StpLogic { List roleList = SaTokenManager.getStpInterface().getRoleList(loginId, loginKey); for (String role : roleArray) { if(roleList.contains(role) == false) { - throw new NotRoleException(role, this.loginKey); // 没有权限抛出异常 + throw new NotRoleException(role, this.loginKey); } } } @@ -815,11 +815,12 @@ public class StpLogic { List roleList = SaTokenManager.getStpInterface().getRoleList(loginId, loginKey); for (String role : roleArray) { if(roleList.contains(role) == true) { - return; // 有的话提前退出 + // 有的话提前退出 + return; } } if(roleArray.length > 0) { - throw new NotRoleException(roleArray[0], this.loginKey); // 没有权限抛出异常 + throw new NotRoleException(roleArray[0], this.loginKey); } } @@ -865,7 +866,7 @@ public class StpLogic { List permissionList = SaTokenManager.getStpInterface().getPermissionList(loginId, loginKey); for (String permission : permissionArray) { if(permissionList.contains(permission) == false) { - throw new NotPermissionException(permission, this.loginKey); // 没有权限抛出异常 + throw new NotPermissionException(permission, this.loginKey); } } } @@ -879,11 +880,12 @@ public class StpLogic { List permissionList = SaTokenManager.getStpInterface().getPermissionList(loginId, loginKey); for (String permission : permissionArray) { if(permissionList.contains(permission) == true) { - return; // 有的话提前退出 + // 有的话提前退出 + return; } } if(permissionArray.length > 0) { - throw new NotPermissionException(permissionArray[0], this.loginKey); // 没有权限抛出异常 + throw new NotPermissionException(permissionArray[0], this.loginKey); } } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java index bda6c67c..6ec62882 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java @@ -37,7 +37,7 @@ public class StpUtil { } /** - * 获取当前tokenValue + * 获取当前tokenValue * @return 当前tokenValue */ public static String getTokenValue() { diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTaskUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTaskUtil.java index bb46f91d..d6e7c8af 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTaskUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTaskUtil.java @@ -51,6 +51,9 @@ public class SaTaskUtil { * @author kong */ public static interface FunctionRunClass{ + /** + * 要执行的方法 + */ public void run(); } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java index 953f9e53..b7e47f48 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java @@ -1,12 +1,15 @@ package cn.dev33.satoken.util; /** - * 定义sa-token的所有常量 + * sa-token常量类 * @author kong * */ public class SaTokenConsts { + + // =================== sa-token版本信息 =================== + /** * sa-token 版本号 */ @@ -16,29 +19,62 @@ public class SaTokenConsts { * sa-token 开源地址 */ public static final String GITHUB_URL = "https://github.com/click33/sa-token"; + + + // =================== 常量key标记 =================== /** - * 如果token为本次请求新创建的,则以此字符串为key存储在当前request中 + * 常量key标记: 如果token为本次请求新创建的,则以此字符串为key存储在当前request中 */ public static final String JUST_CREATED_SAVE_KEY = "JUST_CREATED_SAVE_KEY_"; /** - * 如果本次请求已经验证过[无操作过期], 则以此值存储在当前request中 TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY + * 常量key标记: 如果本次请求已经验证过[无操作过期], 则以此值存储在当前request中 */ public static final String TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY = "TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY_"; /** - * 在登录时,默认使用的设备名称 + * 常量key标记: 在登录时,默认使用的设备名称 */ public static final String DEFAULT_LOGIN_DEVICE = "default-device"; /** - * 在进行临时身份切换时使用的key + * 常量key标记: 在进行临时身份切换时使用的key */ public static final String SWITCH_TO_SAVE_KEY = "SWITCH_TO_SAVE_KEY_"; + // =================== token-style 相关 =================== + /** + * token风格: uuid + */ + public static final String TOKEN_STYLE_UUID = "uuid"; + + /** + * token风格: 简单uuid (不带下划线) + */ + public static final String TOKEN_STYLE_SIMPLE_UUID = "simple-uuid"; + + /** + * token风格: 32位随机字符串 + */ + public static final String TOKEN_STYLE_RANDOM_32 = "random-32"; + + /** + * token风格: 64位随机字符串 + */ + public static final String TOKEN_STYLE_RANDOM_64 = "random-64"; + + /** + * token风格: 128位随机字符串 + */ + public static final String TOKEN_STYLE_RANDOM_128 = "random-128"; + + /** + * token风格: tik风格 (2_14_16) + */ + public static final String TOKEN_STYLE_RANDOM_TIK = "tik"; } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenInsideUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenInsideUtil.java index 57b3ec7c..909f84cf 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenInsideUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenInsideUtil.java @@ -7,31 +7,28 @@ import java.util.List; import java.util.Random; /** - * sa-token 内部代码工具类 + * sa-token 内部代码工具类 + * * @author kong * */ public class SaTokenInsideUtil { - /** - * 打印 sa-token 版本字符画 + * 打印 sa-token 版本字符画 */ public static void printSaToken() { - String str = - "____ ____ ___ ____ _ _ ____ _ _ \r\n" + - "[__ |__| __ | | | |_/ |___ |\\ | \r\n" + - "___] | | | |__| | \\_ |___ | \\| \r\n" + - "sa-token:" + SaTokenConsts.VERSION_NO + " \r\n" + - "GitHub:" + SaTokenConsts.GITHUB_URL; // + "\r\n"; + String str = "____ ____ ___ ____ _ _ ____ _ _ \r\n" + "[__ |__| __ | | | |_/ |___ |\\ | \r\n" + + "___] | | | |__| | \\_ |___ | \\| \r\n" + "sa-token:" + SaTokenConsts.VERSION_NO + + " \r\n" + "GitHub:" + SaTokenConsts.GITHUB_URL; // + "\r\n"; System.out.println(str); } - /** - * 生成指定长度的随机字符串 - * @param length 字符串的长度 - * @return 一个随机字符串 + * 生成指定长度的随机字符串 + * + * @param length 字符串的长度 + * @return 一个随机字符串 */ public static String getRandomString(int length) { String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; @@ -43,68 +40,69 @@ public class SaTokenInsideUtil { } return sb.toString(); } - + /** - * 以当前时间戳和随机int数字拼接一个随机字符串 - * @return 随机字符串 + * 以当前时间戳和随机int数字拼接一个随机字符串 + * + * @return 随机字符串 */ public static String getMarking28() { return System.currentTimeMillis() + "" + new Random().nextInt(Integer.MAX_VALUE); } - - + /** * 从集合里查询数据 - * @param dataList 数据集合 - * @param prefix 前缀 - * @param keyword 关键字 - * @param start 起始位置 (-1代表查询所有) - * @param size 获取条数 - * @return 符合条件的新数据集合 + * + * @param dataList 数据集合 + * @param prefix 前缀 + * @param keyword 关键字 + * @param start 起始位置 (-1代表查询所有) + * @param size 获取条数 + * @return 符合条件的新数据集合 */ - public static List searchList(Collection dataList, String prefix, String keyword, int start, int size) { - if(prefix == null) { + public static List searchList(Collection dataList, String prefix, String keyword, int start, + int size) { + if (prefix == null) { prefix = ""; } - if(keyword == null) { + if (keyword == null) { keyword = ""; } - // 挑选出所有符合条件的 + // 挑选出所有符合条件的 List list = new ArrayList(); Iterator keys = dataList.iterator(); while (keys.hasNext()) { String key = keys.next(); - if(key.startsWith(prefix) && key.indexOf(keyword) > -1) { + if (key.startsWith(prefix) && key.indexOf(keyword) > -1) { list.add(key); } } // 取指定段数据 return searchList(list, start, size); } - + /** * 从集合里查询数据 - * @param list 数据集合 + * + * @param list 数据集合 * @param start 起始位置 (-1代表查询所有) - * @param size 获取条数 - * @return 符合条件的新数据集合 + * @param size 获取条数 + * @return 符合条件的新数据集合 */ public static List searchList(List list, int start, int size) { // 取指定段数据 - if(start < 0) { + if (start < 0) { return list; } int end = start + size; List list2 = new ArrayList(); for (int i = start; i < end; i++) { - if(i >= list.size()) { + if (i >= list.size()) { return list2; } list2.add(list.get(i)); } return list2; } - - - + } diff --git a/sa-token-dao-redis-jackson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisJackson.java b/sa-token-dao-redis-jackson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisJackson.java index 4ce74064..cee598ce 100644 --- a/sa-token-dao-redis-jackson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisJackson.java +++ b/sa-token-dao-redis-jackson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisJackson.java @@ -21,7 +21,10 @@ import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.util.SaTokenInsideUtil; /** - * sa-token持久层的实现类, 基于redis (to jackson) + * sa-token持久层的实现类, 基于redis (使用 jackson 序列化方式) + * + * @author kong + * */ @Component public class SaTokenDaoRedisJackson implements SaTokenDao { @@ -97,7 +100,8 @@ public class SaTokenDaoRedisJackson implements SaTokenDao { @Override public void updateValue(String key, String value) { long expire = getTimeout(key); - if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { // -2 = 无此键 + // -2 = 无此键 + if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { return; } this.setValue(key, value, expire); @@ -167,7 +171,8 @@ public class SaTokenDaoRedisJackson implements SaTokenDao { @Override public void updateSession(SaSession session) { long expire = getSessionTimeout(session.getId()); - if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { // -2 = 无此键 + // -2 = 无此键 + if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { return; } this.saveSession(session, expire); diff --git a/sa-token-dao-redis/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedis.java b/sa-token-dao-redis/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedis.java index 35e6ae18..210fc4cb 100644 --- a/sa-token-dao-redis/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedis.java +++ b/sa-token-dao-redis/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedis.java @@ -18,12 +18,15 @@ import cn.dev33.satoken.util.SaTokenInsideUtil; /** * sa-token持久层的实现类, 基于redis + * + * @author kong + * */ @Component public class SaTokenDaoRedis implements SaTokenDao { /** - * string专用 + * string专用 */ @Autowired public StringRedisTemplate stringRedisTemplate; @@ -52,7 +55,7 @@ public class SaTokenDaoRedis implements SaTokenDao { /** - * 根据key获取value,如果没有,则返回空 + * 根据key获取value,如果没有,则返回空 */ @Override public String getValue(String key) { @@ -78,7 +81,8 @@ public class SaTokenDaoRedis implements SaTokenDao { @Override public void updateValue(String key, String value) { long expire = getTimeout(key); - if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { // -2 = 无此键 + // -2 = 无此键 + if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { return; } this.setValue(key, value, expire); @@ -148,7 +152,8 @@ public class SaTokenDaoRedis implements SaTokenDao { @Override public void updateSession(SaSession session) { long expire = getSessionTimeout(session.getId()); - if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { // -2 = 无此键 + // -2 = 无此键 + if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { return; } this.saveSession(session, expire); diff --git a/sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java b/sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java index 84a71c3d..7cce08de 100644 --- a/sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java +++ b/sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java @@ -11,7 +11,8 @@ import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpUtil; /** - * sa-token 基于 Spring Aop 的注解鉴权 + * sa-token 基于 Spring Aop 的注解鉴权 + * * @author kong */ @Aspect @@ -19,46 +20,46 @@ import cn.dev33.satoken.stp.StpUtil; public class SaCheckAspect { /** - * 创建 + * 构建 */ public SaCheckAspect() { } - + /** - * 获取本切面使用的StpLogic + * 获取本切面使用的StpLogic */ public StpLogic getStpLogic() { return StpUtil.stpLogic; } - /** - * 定义AOP签名 (切入所有使用sa-token鉴权注解的方法) + * 定义AOP签名 (切入所有使用sa-token鉴权注解的方法) */ public static final String POINTCUT_SIGN = "@within(cn.dev33.satoken.annotation.SaCheckLogin) || @annotation(cn.dev33.satoken.annotation.SaCheckLogin) || " + "@within(cn.dev33.satoken.annotation.SaCheckRole) || @annotation(cn.dev33.satoken.annotation.SaCheckRole) || " + "@within(cn.dev33.satoken.annotation.SaCheckPermission) || @annotation(cn.dev33.satoken.annotation.SaCheckPermission)"; /** - * 声明AOP签名 + * 声明AOP签名 */ @Pointcut(POINTCUT_SIGN) public void pointcut() { } /** - * 环绕切入 + * 环绕切入 + * * @param joinPoint 切面对象 * @return 底层方法执行后的返回值 - * @throws Throwable 底层方法抛出的异常 + * @throws Throwable 底层方法抛出的异常 */ @Around("pointcut()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { - // 注解鉴权 + // 注解鉴权 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); getStpLogic().checkMethodAnnotation(signature.getMethod()); try { - // 执行原有逻辑 + // 执行原有逻辑 Object obj = joinPoint.proceed(); return obj; } catch (Throwable e) { diff --git a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/autowired/SaTokenSpringAutowired.java b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/autowired/SaTokenSpringAutowired.java index 4e4306f1..e6102713 100644 --- a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/autowired/SaTokenSpringAutowired.java +++ b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/autowired/SaTokenSpringAutowired.java @@ -16,102 +16,108 @@ import cn.dev33.satoken.spring.SaTokenServletSpringImpl; import cn.dev33.satoken.stp.StpInterface; /** - * 利用spring的自动装配来加载开发者重写的Bean + * 利用spring的自动装配来加载开发者重写的Bean + * * @author kong * */ @Component public class SaTokenSpringAutowired { - /** - * 获取配置Bean - * @return 配置对象 + * 获取配置Bean + * + * @return 配置对象 */ @Bean - @ConfigurationProperties(prefix="spring.sa-token") + @ConfigurationProperties(prefix = "spring.sa-token") public SaTokenConfig getSaTokenConfig() { return new SaTokenConfig(); } - + /** - * 注入配置Bean + * 注入配置Bean + * * @param saTokenConfig 配置对象 */ @Autowired - public void setConfig(SaTokenConfig saTokenConfig){ + public void setConfig(SaTokenConfig saTokenConfig) { SaTokenManager.setConfig(saTokenConfig); } /** - * 注入持久化Bean - * @param saTokenDao . + * 注入持久化Bean + * + * @param saTokenDao SaTokenDao对象 */ @Autowired(required = false) - public void setSaTokenDao(SaTokenDao saTokenDao){ + public void setSaTokenDao(SaTokenDao saTokenDao) { SaTokenManager.setSaTokenDao(saTokenDao); } /** - * 注入权限认证Bean - * @param stpInterface . + * 注入权限认证Bean + * + * @param stpInterface StpInterface对象 */ @Autowired(required = false) - public void setStpInterface(StpInterface stpInterface){ + public void setStpInterface(StpInterface stpInterface) { SaTokenManager.setStpInterface(stpInterface); } /** - * 注入Cookie操作Bean - * @param saTokenCookie . + * 注入Cookie操作Bean + * + * @param saTokenCookie SaTokenCookie对象 */ @Autowired(required = false) - public void setSaTokenCookie(SaTokenCookie saTokenCookie){ + public void setSaTokenCookie(SaTokenCookie saTokenCookie) { SaTokenManager.setSaTokenCookie(saTokenCookie); } /** - * 注入框架行为Bean - * @param saTokenAction . + * 注入框架行为Bean + * + * @param saTokenAction SaTokenAction对象 */ @Autowired(required = false) - public void setSaTokenAction(SaTokenAction saTokenAction){ + public void setSaTokenAction(SaTokenAction saTokenAction) { SaTokenManager.setSaTokenAction(saTokenAction); } /** - * 获取Servlet操作Bean (Spring版) - * @return Servlet操作Bean (Spring版) + * 获取Servlet操作Bean (Spring版) + * + * @return Servlet操作Bean (Spring版) */ @Bean public SaTokenServlet getSaTokenServlet() { return new SaTokenServletSpringImpl(); } - - /** - * 注入Servlet操作Bean - * @param saTokenServlet . - */ - @Autowired - public void setSaTokenServlet(SaTokenServlet saTokenServlet){ - SaTokenManager.setSaTokenServlet(saTokenServlet); - } - - /** - * 路由匹配器 + * 注入Servlet操作Bean + * + * @param saTokenServlet SaTokenServlet对象 + */ + @Autowired + public void setSaTokenServlet(SaTokenServlet saTokenServlet) { + SaTokenManager.setSaTokenServlet(saTokenServlet); + } + + /** + * 路由匹配器 */ public static PathMatcher pathMatcher; + /** - * 利用自动匹配特性,获取SpringMVC框架内部使用的路由匹配器 + * 利用自动匹配特性,获取SpringMVC框架内部使用的路由匹配器 + * * @param pathMatcher 要设置的 pathMatcher */ @Autowired(required = false) public static void setPathMatcher(PathMatcher pathMatcher) { SaTokenSpringAutowired.pathMatcher = pathMatcher; } - - - + } diff --git a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaAnnotationInterceptor.java b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaAnnotationInterceptor.java index a68808c8..8729538e 100644 --- a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaAnnotationInterceptor.java +++ b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaAnnotationInterceptor.java @@ -12,29 +12,29 @@ import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpUtil; /** - * 注解式鉴权 - 拦截器 + * 注解式鉴权 - 拦截器 + * * @author kong */ public class SaAnnotationInterceptor implements HandlerInterceptor { - /** - * 底层的 StpLogic 对象 + * 在进行注解鉴权时使用的 StpLogic 对象 */ public StpLogic stpLogic = null; - + /** - * @return 底层的 StpLogic 对象 + * @return 在进行注解鉴权时使用的 StpLogic 对象 */ public StpLogic getStpLogic() { - if(stpLogic == null) { + if (stpLogic == null) { stpLogic = StpUtil.stpLogic; } return stpLogic; } /** - * @param stpLogic 底层的 StpLogic 对象 + * @param stpLogic 在进行注解鉴权时使用的 StpLogic 对象 * @return 拦截器自身 */ public SaAnnotationInterceptor setStpLogic(StpLogic stpLogic) { @@ -42,33 +42,30 @@ public class SaAnnotationInterceptor implements HandlerInterceptor { return this; } - /** - * 创建,并指定一个默认的 StpLogic + * 构建: 注解式鉴权 - 拦截器 */ public SaAnnotationInterceptor() { } - + /** - * 每次请求之前触发的方法 + * 每次请求之前触发的方法 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - + // 获取处理method if (handler instanceof HandlerMethod == false) { return true; } Method method = ((HandlerMethod) handler).getMethod(); - - // 进行验证 + + // 进行验证 getStpLogic().checkMethodAnnotation(method); - - // 通过验证 + + // 通过验证 return true; } - - } diff --git a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteFunction.java b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteFunction.java index bbb5562e..a34554a7 100644 --- a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteFunction.java +++ b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteFunction.java @@ -5,16 +5,18 @@ import javax.servlet.http.HttpServletResponse; /** * 执行验证方法的辅助类 + * * @author kong * */ public interface SaRouteFunction { /** - * 执行验证的方法 - * @param request request对象 - * @param response response对象 - * @param handler 处理对象 + * 执行验证的方法 + * + * @param request request对象 + * @param response response对象 + * @param handler 处理对象 */ public void run(HttpServletRequest request, HttpServletResponse response, Object handler); diff --git a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouterUtil.java b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouterUtil.java index 235d7aaf..e52b545e 100644 --- a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouterUtil.java +++ b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouterUtil.java @@ -19,7 +19,7 @@ import cn.dev33.satoken.fun.SaFunction; public class SaRouterUtil { /** - * 在进行路由匹配时所使用的的 PathMatcher 对象 + * 在进行路由匹配时所使用的 PathMatcher 对象 */ private static PathMatcher pathMatcher; diff --git a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenServletSpringImpl.java b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenServletSpringImpl.java index 2727b5c9..e9e7ca70 100644 --- a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenServletSpringImpl.java +++ b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenServletSpringImpl.java @@ -6,14 +6,15 @@ import javax.servlet.http.HttpServletResponse; import cn.dev33.satoken.servlet.SaTokenServlet; /** - * sa-token 对cookie的相关操作 接口实现类 + * sa-token 对cookie的相关操作 接口实现类 + * * @author kong * */ public class SaTokenServletSpringImpl implements SaTokenServlet { /** - * 获取当前请求的Request对象 + * 获取当前请求的Request对象 */ @Override public HttpServletRequest getRequest() { @@ -21,11 +22,11 @@ public class SaTokenServletSpringImpl implements SaTokenServlet { } /** - * 获取当前请求的Response对象 + * 获取当前请求的Response对象 */ @Override public HttpServletResponse getResponse() { return SpringMVCUtil.getResponse(); } - + } diff --git a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SpringMVCUtil.java b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SpringMVCUtil.java index 36a00534..35eb5a54 100644 --- a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SpringMVCUtil.java +++ b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SpringMVCUtil.java @@ -6,6 +6,8 @@ import javax.servlet.http.HttpServletResponse; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import cn.dev33.satoken.exception.SaTokenException; + /** * SpringMVC相关操作 * @author kong @@ -18,9 +20,9 @@ public class SpringMVCUtil { * @return request */ public static HttpServletRequest getRequest() { - ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();// 大善人SpringMVC提供的封装 + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if(servletRequestAttributes == null) { - throw new RuntimeException("当前环境非JavaWeb"); + throw new SaTokenException("非Web上下文无法获取Request"); } return servletRequestAttributes.getRequest(); } @@ -30,9 +32,9 @@ public class SpringMVCUtil { * @return response */ public static HttpServletResponse getResponse() { - ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();// 大善人SpringMVC提供的封装 + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if(servletRequestAttributes == null) { - throw new RuntimeException("当前环境非JavaWeb"); + throw new SaTokenException("非Web上下文无法获取Request"); } return servletRequestAttributes.getResponse(); }