Pārlūkot izejas kodu

验证码相关调整

zhuang 1 gadu atpakaļ
vecāks
revīzija
56f26c8f27

+ 13 - 10
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxApiServiceImpl.java

@@ -99,7 +99,7 @@ public class ZhcxApiServiceImpl implements ZhcxApiService {
             return R.error("501","未获取到手机号,请联系系统管理员");
         }
         String redisKeyName = loginType + phone;
-        String redisLabelName = loginType + account;
+        String redisLabelName = CxConstants.LOGIN_SEND_CODE_PREFIX+loginType + account;
         return sendSmsCode(null, redisKeyName, phone, redisLabelName);
     }
 
@@ -185,16 +185,18 @@ public class ZhcxApiServiceImpl implements ZhcxApiService {
     private R sendSmsCode(String templateId, String redisKeyName, String mobile, String redisLabelName) {
         boolean exists = redisService.hasKey(redisKeyName);
         String sendCodeTimeObj = (String) redisService.getRedisCatchObj(redisKeyName);
-        if (StringUtils.isBlank(sendCodeTimeObj)) {
-            sendCodeTimeObj = "0";
-        }
-        int sendCodeTime = Integer.parseInt(sendCodeTimeObj);
+        int sendCodeTime = StringUtils.isBlank(sendCodeTimeObj) ? 0 : Integer.parseInt(sendCodeTimeObj);
         if( exists && sendCodeTime >= 20 ){
-            sendCodeTime += 1;
-            redisService.redisCatchInit(redisKeyName,String.valueOf(sendCodeTime),CxConstants.SEND_CODE_INTERVAL);
+            //sendCodeTime += 1;
+            //redisService.redisCatchInit(redisKeyName,String.valueOf(sendCodeTime),CxConstants.SEND_CODE_INTERVAL);
             return R.error("验证发送次数频繁,请过5分钟后再尝试");
         }
-        String code = SmsCodeGenerateUtils.getInstance().generateVerificationCode();
+        String code = null;
+        try {
+            code = SmsCodeGenerateUtils.generateVerificationCode(6);
+        } catch (Exception e) {
+           log.info("生成短信验证码失败"+e);
+        }
         try {
             JSONObject jsonObject = HwSmsUtil.sendSms(templateId,null, code, mobile);
             String returnCode = jsonObject.getString("code");
@@ -204,13 +206,14 @@ public class ZhcxApiServiceImpl implements ZhcxApiService {
                 }
                 sendCodeTime += 1;
                 redisService.redisCatchInit(redisKeyName,String.valueOf(sendCodeTime),CxConstants.SEND_CODE_INTERVAL);
-                redisService.redisCatchInit(redisLabelName,code.toString(),CxConstants.VERIFICATION_CODE_EXPIRATION);
+                redisService.redisCatchInit(redisLabelName,code,CxConstants.VERIFICATION_CODE_EXPIRATION);
                 JSONObject json = new JSONObject();
                 json.put("phone",mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"));
                 return R.ok("发送成功").putData(json);
             }
+            log.info("华为云短信接口调用返回:"+jsonObject);
         } catch (Exception e) {
-            e.printStackTrace();
+            log.info("发送短信失败"+e);
         }
         return R.error("获取账号信息失败, 请联系管理员!");
     }

+ 3 - 2
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxLoginServiceImpl.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.rongwei.bscommon.sys.feign.RwAdminServerFeignService;
 import com.rongwei.bscommon.sys.service.ZhcxLoginService;
+import com.rongwei.bscommon.sys.utils.CxConstants;
 import com.rongwei.commonservice.service.RedisService;
 import com.rongwei.rwadmincommon.system.domain.SysUserDo;
 import com.rongwei.rwadmincommon.system.domain.UserLoginVo;
@@ -66,14 +67,14 @@ public class ZhcxLoginServiceImpl implements ZhcxLoginService {
             return R.error("用户名密码不正确");
         }
 
-        boolean exist = redisService.hasKey(loginType + account);
+        boolean exist = redisService.hasKey(CxConstants.LOGIN_SEND_CODE_PREFIX+loginType + account);
         String remark = sysUserDo.getRemark();
         boolean contains = false;
         if(StringUtils.isNotBlank(remark)){
             contains = "skip".equals(sysUserDo.getRemark());
         }
         if(exist || contains){
-            Object yzmObj = redisService.getRedisCatchObj(loginType + account);
+            Object yzmObj = redisService.getRedisCatchObj(CxConstants.LOGIN_SEND_CODE_PREFIX+loginType + account);
             if(ObjectUtil.isEmpty(yzmObj) && !contains){
                 return R.error("未获取到验证码或验证码已过期,请获取验证码");
             }else{

+ 1 - 1
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxRegisterServiceImpl.java

@@ -134,7 +134,7 @@ public class ZhcxRegisterServiceImpl implements ZhcxRegisterService {
         if (exists && sendCodeTime >= CxConstants.MAX_SEND_CODE_TIME) {
             return R.error("501", "验证码发送频繁,请过5分钟后再尝试");
         }
-        String code = SmsCodeGenerateUtils.getInstance().generateVerificationCode();
+        String code = SmsCodeGenerateUtils.generateVerificationCode(6);
         try {
             JSONObject jsonObject = HwSmsUtil.sendSms(null,null, code.toString(), mobile);
             String returnCode = jsonObject.getString("code");

+ 58 - 31
business-common/src/main/java/com/rongwei/bscommon/sys/utils/SmsCodeGenerateUtils.java

@@ -1,53 +1,80 @@
 package com.rongwei.bscommon.sys.utils;
 
 import java.security.SecureRandom;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  * @author zhuang
  */
 public class SmsCodeGenerateUtils {
 
-    private static final SecureRandom secureRandom = new SecureRandom();
-    private static final StringBuilder codeStringBuilder = new StringBuilder();
+//    private static final SecureRandom secureRandom = new SecureRandom();
+//    private static final StringBuilder codeStringBuilder = new StringBuilder();
+//    /**
+//     * 采用单例模式以重用StringBuilder,同时提供一个方法来生成指定长度的验证码
+//     */
+//    private static final SmsCodeGenerateUtils INSTANCE = new SmsCodeGenerateUtils();
+//
+//    /**
+//     * 私有化构造方法防止外部实例化
+//     */
+//    private SmsCodeGenerateUtils() {
+//        // 初始化6位
+//        codeStringBuilder.setLength(CxConstants.CODE_LENGTH);
+//    }
+//
+//    /**
+//     * 提供一个接口来获取验证码生成器实例,这样也使得未来如果有需要,可以轻松地修改生成逻辑
+//     * @return
+//     */
+//    public static SmsCodeGenerateUtils getInstance() {
+//        return INSTANCE;
+//    }
+//
+//    /**
+//     * 生成6位验证码方法
+//     * @return
+//     */
+//    public String generateVerificationCode() {
+//        codeStringBuilder.setLength(0);
+//        for (int i = 0; i < CxConstants.CODE_LENGTH; i++) {
+//            codeStringBuilder.append(generateRandomDigit());
+//        }
+//        return codeStringBuilder.toString();
+//    }
+//
+//
+//    /**
+//     * 生成一个随机数字,0到9之间的整数
+//     * @return
+//     */
+//    private int generateRandomDigit() {
+//        return secureRandom.nextInt(10) + 1;
+//    }
     /**
-     * 采用单例模式以重用StringBuilder,同时提供一个方法来生成指定长度的验证码
+     * 采用静态方法直接提供服务,避免单例模式。
+     * 使用ThreadLocal<StringBuilder>确保每个线程都有自己的StringBuilder实例,从而保证线程安全。
      */
-    private static final SmsCodeGenerateUtils INSTANCE = new SmsCodeGenerateUtils();
+    public static String generateVerificationCode(int codeLength) {
+        StringBuilder codeStringBuilder = new ThreadLocal<StringBuilder>() {
+            @Override
+            protected StringBuilder initialValue() {
+                return new StringBuilder(codeLength);
+            }
+        }.get();
 
-    /**
-     * 私有化构造方法防止外部实例化
-     */
-    private SmsCodeGenerateUtils() {
-        // 初始化6位
-        codeStringBuilder.setLength(CxConstants.CODE_LENGTH);
-    }
-
-    /**
-     * 提供一个接口来获取验证码生成器实例,这样也使得未来如果有需要,可以轻松地修改生成逻辑
-     * @return
-     */
-    public static SmsCodeGenerateUtils getInstance() {
-        return INSTANCE;
-    }
-
-    /**
-     * 生成6位验证码方法
-     * @return
-     */
-    public String generateVerificationCode() {
-        codeStringBuilder.setLength(0);
-        for (int i = 0; i < CxConstants.CODE_LENGTH; i++) {
+        for (int i = 0; i < codeLength; i++) {
             codeStringBuilder.append(generateRandomDigit());
         }
         return codeStringBuilder.toString();
     }
 
-
     /**
-     * 生成一个随机数字,0到9之间的整数
+     * 生成一个随机数字,0到9之间的整数。
+     * 移除了多余的+1操作。
      * @return
      */
-    private int generateRandomDigit() {
-        return secureRandom.nextInt(10) + 1;
+    private static int generateRandomDigit() {
+        return ThreadLocalRandom.current().nextInt(1,10);
     }
 }