From 267b74bed7236a0b90d123801f7ae806c45e0c3c Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Fri, 2 Aug 2019 20:41:06 +0800 Subject: [PATCH] =?UTF-8?q?:memo:=20=E5=A2=9E=E5=8A=A0=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E3=80=81=E5=8E=BB=E6=8E=89slf4j=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E3=80=81=E5=A2=9E=E5=8A=A0Log=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 - .../me/zhyd/oauth/cache/AuthCacheConfig.java | 24 ++++ .../me/zhyd/oauth/cache/AuthDefaultCache.java | 12 +- src/main/java/me/zhyd/oauth/log/Log.java | 126 ++++++++++++++++++ .../oauth/request/AuthDefaultRequest.java | 4 +- .../me/zhyd/oauth/request/AuthMiRequest.java | 5 +- src/test/java/me/zhyd/oauth/log/LogTest.java | 111 +++++++++++++++ .../java/me/zhyd/oauth/utils/CustomTest.java | 87 ------------ .../me/zhyd/oauth/utils/JsonPathTest.java | 37 +++++ update.md | 6 + 10 files changed, 312 insertions(+), 106 deletions(-) create mode 100644 src/main/java/me/zhyd/oauth/cache/AuthCacheConfig.java create mode 100644 src/main/java/me/zhyd/oauth/log/Log.java create mode 100644 src/test/java/me/zhyd/oauth/log/LogTest.java delete mode 100644 src/test/java/me/zhyd/oauth/utils/CustomTest.java create mode 100644 src/test/java/me/zhyd/oauth/utils/JsonPathTest.java diff --git a/pom.xml b/pom.xml index 36c46be..576bbcd 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,6 @@ 4.11 1.2.58 3.7.4.ALL - 1.7.25 0.8.2 @@ -96,11 +95,6 @@ ${alipay-sdk-version} provided - - org.slf4j - slf4j-simple - ${slf4j-version} - diff --git a/src/main/java/me/zhyd/oauth/cache/AuthCacheConfig.java b/src/main/java/me/zhyd/oauth/cache/AuthCacheConfig.java new file mode 100644 index 0000000..3a961fd --- /dev/null +++ b/src/main/java/me/zhyd/oauth/cache/AuthCacheConfig.java @@ -0,0 +1,24 @@ +package me.zhyd.oauth.cache; + +/** + * AuthCache配置类 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @date 2019/8/1 17:15 + * @since 1.8 + */ +public class AuthCacheConfig { + + /** + * 默认缓存过期时间:3分钟 + * 鉴于授权过程中,根据个人的操作习惯,或者授权平台的不同(google等),每个授权流程的耗时也有差异,不过单个授权流程一般不会太长 + * 本缓存工具默认的过期时间设置为3分钟,即程序默认认为3分钟内的授权有效,超过3分钟则默认失效,失效后删除 + */ + public static long timeout = 3 * 60 * 1000; + + /** + * 是否开启定时{@link AuthDefaultCache#pruneCache()}的任务 + */ + public static boolean schedulePrune = true; +} diff --git a/src/main/java/me/zhyd/oauth/cache/AuthDefaultCache.java b/src/main/java/me/zhyd/oauth/cache/AuthDefaultCache.java index 6da6695..7948214 100644 --- a/src/main/java/me/zhyd/oauth/cache/AuthDefaultCache.java +++ b/src/main/java/me/zhyd/oauth/cache/AuthDefaultCache.java @@ -18,12 +18,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; */ public class AuthDefaultCache implements AuthCache { - /** - * 默认缓存过期时间:3分钟 - * 鉴于授权过程中,根据个人的操作习惯,或者授权平台的不同(google等),每个授权流程的耗时也有差异,不过单个授权流程一般不会太长 - * 本缓存工具默认的过期时间设置为3分钟,即程序默认认为3分钟内的授权有效,超过3分钟则默认失效,失效后删除 - */ - private static final long DEF_TIMEOUT = 3 * 60 * 1000; /** * state cache */ @@ -33,7 +27,9 @@ public class AuthDefaultCache implements AuthCache { private final Lock readLock = cacheLock.readLock(); public AuthDefaultCache() { - this.schedulePrune(DEF_TIMEOUT); + if (AuthCacheConfig.schedulePrune) { + this.schedulePrune(AuthCacheConfig.timeout); + } } /** @@ -44,7 +40,7 @@ public class AuthDefaultCache implements AuthCache { */ @Override public void set(String key, String value) { - set(key, value, DEF_TIMEOUT); + set(key, value, AuthCacheConfig.timeout); } /** diff --git a/src/main/java/me/zhyd/oauth/log/Log.java b/src/main/java/me/zhyd/oauth/log/Log.java new file mode 100644 index 0000000..50aed60 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/log/Log.java @@ -0,0 +1,126 @@ +package me.zhyd.oauth.log; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.io.PrintStream; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * 针对JustAuth提供的轻量级的日志打印工具 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @date 2019/8/1 17:14 + * @since 1.8 + */ +public class Log { + + public static void debug(String msg) { + debug(msg, null); + } + + public static void warn(String msg) { + warn(msg, null); + } + + public static void error(String msg) { + error(msg, null); + } + + public static void debug(String msg, Throwable t) { + print(Level.DEBUG, msg, t, System.out); + } + + public static void warn(String msg, Throwable t) { + print(Level.WARN, msg, t, System.out); + } + + public static void error(String msg, Throwable t) { + print(Level.ERROR, msg, t, System.err); + } + + private static void print(Level level, String msg, Throwable t, PrintStream ps) { + if (Config.enable) { + if (level.getLevelNum() >= Config.level.getLevelNum()) { + ps.println(String.format("%s %s %s [%s] - %s", getDate(), Thread.currentThread().getName(), getCaller(), level, msg)); + writeThrowable(t, ps); + ps.flush(); + } + } + } + + private static String getCaller() { + int offset = 2; + StackTraceElement[] stackTraceArr = (new Throwable()).getStackTrace(); + StackTraceElement stackTrace = null; + if (offset >= stackTraceArr.length) { + offset = offset - 1; + } + stackTrace = stackTraceArr[offset]; + return stackTrace.getClassName() + + "(" + + stackTrace.getMethodName() + + ':' + + stackTrace.getLineNumber() + + ")"; + } + + private static String getDate() { + return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + + private static void writeThrowable(Throwable t, PrintStream targetStream) { + if (t != null) { + t.printStackTrace(targetStream); + } + } + + /** + * 日志级别 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @date 2019/8/2 19:49 + * @since 1.8 + */ + @Getter + @AllArgsConstructor + public enum Level { + /** + * DEBUG: 普通级别 + */ + DEBUG(10), + /** + * WARN: 警告级别 + */ + WARN(30), + /** + * ERROR: 异常级别 + */ + ERROR(40); + + private int levelNum; + } + + /** + * 日志配置 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @date 2019/8/1 17:14 + * @since 1.8 + */ + static class Config { + + /** + * 需要打印的日志级别 + */ + static Level level = Level.DEBUG; + /** + * 是否启用日志打印功能,默认启用 + */ + static boolean enable = true; + } +} diff --git a/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java index 401c8b4..63d1e73 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java @@ -8,6 +8,7 @@ import me.zhyd.oauth.config.AuthConfig; import me.zhyd.oauth.config.AuthSource; import me.zhyd.oauth.enums.AuthResponseStatus; import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.log.Log; import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthResponse; import me.zhyd.oauth.model.AuthToken; @@ -24,7 +25,6 @@ import me.zhyd.oauth.utils.UuidUtils; * @author yangkai.shen (https://xkcoding.com) * @since 1.0.0 */ -@Slf4j public abstract class AuthDefaultRequest implements AuthRequest { protected AuthConfig config; protected AuthSource source; @@ -75,7 +75,7 @@ public abstract class AuthDefaultRequest implements AuthRequest { AuthUser user = this.getUserInfo(authToken); return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(user).build(); } catch (Exception e) { - log.error("Failed to login with oauth authorization.", e); + Log.error("Failed to login with oauth authorization.", e); return this.responseError(e); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java b/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java index 46f13c5..d38f3d3 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java @@ -4,12 +4,12 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONObject; -import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.config.AuthConfig; import me.zhyd.oauth.config.AuthSource; import me.zhyd.oauth.enums.AuthResponseStatus; import me.zhyd.oauth.enums.AuthUserGender; import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.log.Log; import me.zhyd.oauth.model.*; import me.zhyd.oauth.utils.UrlBuilder; @@ -21,7 +21,6 @@ import java.text.MessageFormat; * @author yangkai.shen (https://xkcoding.com) * @since 1.5.0 */ -@Slf4j public class AuthMiRequest extends AuthDefaultRequest { private static final String PREFIX = "&&&START&&&"; @@ -88,7 +87,7 @@ public class AuthMiRequest extends AuthDefaultRequest { JSONObject emailPhone = userEmailPhone.getJSONObject("data"); authUser.setEmail(emailPhone.getString("email")); } else { - log.warn("小米开发平台暂时不对外开放用户手机及邮箱信息的获取"); + Log.warn("小米开发平台暂时不对外开放用户手机及邮箱信息的获取"); } return authUser; diff --git a/src/test/java/me/zhyd/oauth/log/LogTest.java b/src/test/java/me/zhyd/oauth/log/LogTest.java new file mode 100644 index 0000000..d729da3 --- /dev/null +++ b/src/test/java/me/zhyd/oauth/log/LogTest.java @@ -0,0 +1,111 @@ +package me.zhyd.oauth.log; + +import org.junit.Test; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @date 2019/8/2 19:36 + * @since 1.8 + */ +public class LogTest { + + public static void main(String[] args) { + // 测试正常打印 + Log.debug("[1] This is a test."); + Log.debug("[1] This is a test.", new NullPointerException("npe")); + + Log.warn("[1] This is a test."); + Log.warn("[1] This is a test.", new NullPointerException("npe")); + + Log.error("[1] This is a test."); + Log.error("[1] This is a test.", new NullPointerException("npe")); + + // 测试只打印 error级别的日志 + Log.Config.level = Log.Level.ERROR; + + Log.debug("[2] This is a test."); + Log.warn("[2] This is a test."); + Log.error("[2] This is a test."); + + // 测试关闭日志 + Log.Config.enable = false; + + Log.debug("[3] This is a test."); + Log.warn("[3] This is a test."); + Log.error("[3] This is a test."); + } + + /** + * 1000000: 23135ms + * 100000: 3016ms + * 10000: 328ms + * 1000: 26ms + */ + @Test + public void testByThread() { + long start = System.currentTimeMillis(); + for (int i = 0; i < 1; i++) { + System.out.println(callMethodByThread()); + } + long end = System.currentTimeMillis(); + System.out.println((end - start) + "ms"); + + } + + /** + * 1000000: 19058ms + * 100000: 2772ms + * 10000: 323ms + * 1000: 29ms + */ + @Test + public void testByThrowable() { + long end = System.currentTimeMillis(); + for (int i = 0; i < 1; i++) { + System.out.println(callMethodByThrowable()); + } + long end2 = System.currentTimeMillis(); + System.out.println((end2 - end) + "ms"); + + } + + @Test + public void testBySecurityManager() { + long end = System.currentTimeMillis(); + for (int i = 0; i < 1; i++) { + System.out.println(callMethodBySecurityManager()); + } + long end2 = System.currentTimeMillis(); + System.out.println((end2 - end) + "ms"); + + } + + private String callMethodByThread() { + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + for (StackTraceElement stackTraceElement : stackTrace) { + System.out.println(stackTraceElement.getMethodName()); + } + return stackTrace[2].getMethodName(); + } + + private String callMethodByThrowable() { + StackTraceElement[] stackTrace = (new Throwable()).getStackTrace(); + for (StackTraceElement stackTraceElement : stackTrace) { + System.out.println(stackTraceElement.getMethodName()); + } + return stackTrace[2].getMethodName(); + } + + private String callMethodBySecurityManager() { + return new SecurityManager() { + String getClassName() { + for (Class clazz : getClassContext()) { + System.out.println(clazz); + } + return getClassContext()[0].getName(); + } + }.getClassName(); + } + +} diff --git a/src/test/java/me/zhyd/oauth/utils/CustomTest.java b/src/test/java/me/zhyd/oauth/utils/CustomTest.java deleted file mode 100644 index ccab7d2..0000000 --- a/src/test/java/me/zhyd/oauth/utils/CustomTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package me.zhyd.oauth.utils; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.alibaba.fastjson.JSONPath; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 其他测试方法 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - */ -public class CustomTest { - - /** - * 1000000: 23135ms - * 100000: 3016ms - * 10000: 328ms - * 1000: 26ms - */ - @Test - public void test() { - long start = System.currentTimeMillis(); - for (int i = 0; i < 1000; i++) { - callMethod(); - } - long end = System.currentTimeMillis(); - System.out.println((end - start) + "ms"); - - } - - /** - * 1000000: 19058ms - * 100000: 2772ms - * 10000: 323ms - * 1000: 29ms - */ - @Test - public void test2() { - long end = System.currentTimeMillis(); - for (int i = 0; i < 1000; i++) { - callMethod2(); - } - long end2 = System.currentTimeMillis(); - System.out.println((end2 - end) + "ms"); - - } - - public String callMethod() { - StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); -// for (StackTraceElement stackTraceElement : stackTrace) { -// System.out.println(stackTraceElement.getMethodName()); -// } - return stackTrace[2].getMethodName(); - } - - public String callMethod2() { - StackTraceElement[] stackTrace = (new Throwable()).getStackTrace(); -// for (StackTraceElement stackTraceElement : stackTrace) { -// System.out.println(stackTraceElement.getMethodName()); -// } - return stackTrace[2].getMethodName(); - } - - @Test - public void jsonpath() { - List>> list = new ArrayList<>(); - - Map> map = new HashMap<>(); - Map node = new HashMap<>(); - node.put("emailAddress", "xxxx"); - map.put("handle~", node); - list.add(map); - - - Map master = new HashMap<>(); -// master.put("elements", list); - JSONObject emailObj = JSONObject.parseObject(JSON.toJSONString(master)); - Object object = JSONPath.eval(emailObj, "$['elements'][0]['handle~']['emailAddress']"); - System.out.println(object); - } -} diff --git a/src/test/java/me/zhyd/oauth/utils/JsonPathTest.java b/src/test/java/me/zhyd/oauth/utils/JsonPathTest.java new file mode 100644 index 0000000..0d4a980 --- /dev/null +++ b/src/test/java/me/zhyd/oauth/utils/JsonPathTest.java @@ -0,0 +1,37 @@ +package me.zhyd.oauth.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONPath; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * JsonPath用法测试 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + */ +public class JsonPathTest { + + @Test + public void jsonPath() { + List>> list = new ArrayList<>(); + + Map> map = new HashMap<>(); + Map node = new HashMap<>(); + node.put("emailAddress", "xxxx"); + map.put("handle~", node); + list.add(map); + + + Map master = new HashMap<>(); +// master.put("elements", list); + JSONObject emailObj = JSONObject.parseObject(JSON.toJSONString(master)); + Object object = JSONPath.eval(emailObj, "$['elements'][0]['handle~']['emailAddress']"); + System.out.println(object); + } +} diff --git a/update.md b/update.md index 82632ee..10e2944 100644 --- a/update.md +++ b/update.md @@ -1,3 +1,9 @@ +### 2019/08/02 + +- 增加`AuthCache`配置类`AuthCacheConfig.java`,可以自定义缓存有效期以及是否开启定时任务 +- 去掉`slf4j`依赖,封装`Log.java`工具类 +- 规范测试类 + ### 2019/07/31 ([v1.9.5](https://gitee.com/yadong.zhang/JustAuth/releases/v1.9.5)) `v1.9.4`版本发布失败,请升级到`1.9.5`版本! -- GitLab