一、郵箱驗證碼
1、隨機生成驗證碼工具類
/*** 隨機生成驗證碼工具類*/
public class ValidateCodeUtils {/*** 隨機生成驗證碼* @param length 長度為4位或者6位* @return*/public static Integer generateValidateCode(int length){Integer code =null;if(length == 4){code = new Random().nextInt(9999);//生成隨機數,最大為9999if(code < 1000){code = code + 1000;//保證隨機數為4位數字}}else if(length == 6){code = new Random().nextInt(999999);//生成隨機數,最大為999999if(code < 100000){code = code + 100000;//保證隨機數為6位數字}}else{throw new RuntimeException("只能生成4位或6位數字驗證碼");}return code;}/*** 隨機生成指定長度字符串驗證碼* @param length 長度* @return*/public static String generateValidateCode4String(int length){Random rdm = new Random();String hash1 = Integer.toHexString(rdm.nextInt());String capstr = hash1.substring(0, length);return capstr;}
}
2、郵箱配置
@Component
@Configuration
public class MailConfig {@Resourceprivate MailProperties mailProperties;public String getFrom() {return mailProperties.getFrom();}public JavaMailSender getMailSender(String username, String password) {JavaMailSenderImpl mailSender = new JavaMailSenderImpl();mailSender.setHost(mailProperties.getHost());mailSender.setPort(mailProperties.getPort());// 如果沒有自定義的用戶,就使用配置類里面的用戶mailSender.setUsername(StringUtils.defaultString(username, mailProperties.getUsername()));mailSender.setPassword(StringUtils.defaultString(password, mailProperties.getPassword()));Properties props = mailSender.getJavaMailProperties();// starttls.enable = true 時為 smtpsprops.put("mail.transport.protocol", "smtps");props.put("mail.smtp.auth", mailProperties.getAuth());props.put("mail.smtp.starttls.enable", mailProperties.getStarttlsEnable());props.put("mail.smtp.ssl.trust", mailProperties.getSslTrust());props.put("mail.debug", "true");return mailSender;}
}
3、發送驗證碼
public void email(String email) {SimpleMailMessage message = new SimpleMailMessage();//接收者//郵件發送人message.setFrom(mailConfig.getFrom());// 郵件接收人(可以使用 String[] 發送給多個用戶)if (StringUtils.isEmpty(email)){throw new ServiceException("指定接收者");}message.setTo(email);// 郵件標題message.setSubject("【phbbb】郵箱驗證碼");//隨機生成6位驗證碼String code = ValidateCodeUtils.generateValidateCode(6).toString();System.out.println(code);//存儲到redis 設置失效時間一分鐘redisTemplate.opsForValue().set(CacheConstants.CAPTCHA_CODE_KEY + email,code,120, TimeUnit.SECONDS);// 郵件內容message.setText("修改用戶資料的郵箱驗證碼為:" + code + ",驗證碼有效期為2分鐘!");// 發送郵件mailConfig.getMailSender(null, null).send(message);}
二、短信發送驗證碼
1、短信發送工具類
/*** 短信發送工具類*/
@Component
public class SMSUtils {/*** 發送短信* @param signName 簽名* @param templateCode 模板* @param phoneNumbers 手機號* @param param 參數*/private static final Logger log = LoggerFactory.getLogger(SMSUtils.class);@Value("${sms.accessKeyId}")private static String accessKeyId;@Value("${sms.secret}")private static String secret;@Value("${sms.signName}")private static String signName; // 短信簽名@Value("${sms.templateCode}")private static String templateCode; //短信模板@Value("${sms.regionId}")private static String regionId; // 短信服務器區域public static void sendMessage(String phone,String code){DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, secret);DefaultAcsClient client = new DefaultAcsClient(profile);CommonRequest request = new CommonRequest();request.setSysMethod(MethodType.POST);//下面兩個不能動request.setSysProduct("Dysmsapi");request.setSysDomain("dysmsapi.aliyuncs.com");request.setSysVersion("2017-05-25");request.setSysAction("SendSms");//自定義參數(手機號,驗證碼,簽名,模板)request.putQueryParameter("RegoinId", regionId);request.putQueryParameter("PhoneNumbers", phone);request.putQueryParameter("SignName", signName); //填自己申請的名稱request.putQueryParameter("TemplateCode", templateCode);request.putQueryParameter("TemplateParam", "{\"code\":\"" + code + "\"}");try {CommonResponse response = client.getCommonResponse(request);boolean success = response.getHttpResponse().isSuccess();System.out.println(success + "短信發送成功");}catch (Exception e) {e.printStackTrace();}}
}
2、發送驗證碼?
@ApiOperation("發送短信驗證碼")
@PostMapping("/sendSms")
public Result sendSms(String phone) {if(StringUtils.isNotEmpty(phone)){//生成隨機的4位驗證碼String code = ValidateCodeUtils.generateValidateCode(4).toString();//調用阿里云提供的短信服務API完成發送短信SMSUtils.sendMessage(phone,code);//需要將生成的驗證碼保存到redis,設置失效時間五分鐘redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);return success("手機驗證碼短信發送成功");}return error("短信發送失敗");
}