Browse Source

优化验证码使用逻辑

woody 1 year ago
parent
commit
444dfc842f

+ 14 - 0
framework-sms/src/main/java/com/chelvc/framework/sms/Captcha.java

@@ -1,6 +1,7 @@
 package com.chelvc.framework.sms;
 
 import java.io.Serializable;
+import java.util.Objects;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -36,4 +37,17 @@ public class Captcha implements Serializable {
      * 手机号
      */
     private String mobile;
+
+    /**
+     * 检测验证码是否正确
+     *
+     * @param token  令牌标识
+     * @param mobile 手机号
+     * @param code   验证码
+     * @return true/false
+     */
+    public boolean check(String token, String mobile, String code) {
+        return Objects.equals(this.token, token) && Objects.equals(this.mobile, mobile)
+                && Objects.equals(this.code, code);
+    }
 }

+ 3 - 3
framework-sms/src/main/java/com/chelvc/framework/sms/CaptchaSmsHandler.java

@@ -1,6 +1,6 @@
 package com.chelvc.framework.sms;
 
-import java.util.function.Consumer;
+import java.util.function.Function;
 
 /**
  * 短信验证码操作接口
@@ -29,9 +29,9 @@ public interface CaptchaSmsHandler {
      * 使用验证码(使用后移除)
      *
      * @param mobile   手机号
-     * @param consumer 验证码信息回调方法
+     * @param function 验证码应用回调接口(返回true则移除验证码)
      */
-    void using(String mobile, Consumer<Captcha> consumer);
+    void using(String mobile, Function<Captcha, Boolean> function);
 
     /**
      * 检测验证码是否正确

+ 5 - 10
framework-sms/src/main/java/com/chelvc/framework/sms/support/SwitchableCaptchaSmsHandler.java

@@ -5,7 +5,7 @@ import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
+import java.util.function.Function;
 
 import com.chelvc.framework.base.context.ApplicationContextHolder;
 import com.chelvc.framework.base.context.SessionContextHolder;
@@ -119,22 +119,17 @@ public class SwitchableCaptchaSmsHandler implements CaptchaSmsHandler {
     }
 
     @Override
-    public void using(@NonNull String mobile, @NonNull Consumer<Captcha> consumer) {
+    public void using(@NonNull String mobile, @NonNull Function<Captcha, Boolean> function) {
         Captcha captcha = this.getCaptcha(mobile);
-        try {
-            consumer.accept(captcha);
-        } finally {
-            if (captcha != null) {
-                this.redisTemplate.delete(this.key(mobile));
-            }
+        if (Boolean.TRUE.equals(function.apply(captcha))) {
+            this.redisTemplate.delete(this.key(mobile));
         }
     }
 
     @Override
     public boolean check(@NonNull String token, @NonNull String mobile, @NonNull String code) {
         Captcha captcha = this.getCaptcha(mobile);
-        return captcha != null && Objects.equals(token, captcha.getToken())
-                && Objects.equals(mobile, captcha.getMobile()) && Objects.equals(code, captcha.getCode());
+        return captcha != null && captcha.check(token, mobile, code);
     }
 
     @Override