手机号验证码/邮箱密码的发送及防刷核对
原创1.发送短信验证码和界面刷防
1,前台注册或登录页面调用后端接口(防刷,并使用openfeign拨打其他服务发送短信):
@ResponseBody
@GetMapping("/sms/sendcode")
public R sendCodeForSms(@RequestParam("phone") String phone){
//防刷检查防刷(防止60秒内再次发送验证码)
String redisCode = redisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone);
if(!StringUtils.isEmpty(redisCode)){
Long l = Long.parseLong(redisCode.split("_")[1]);
if(System.currentTimeMillis()-l<60000){
//证明和验证码已发送,时间更短60秒
return R.error(BizCodeEnume.SMS_CODE_EXCEPTION.getCode(),BizCodeEnume.SMS_CODE_EXCEPTION.getMsg());
}
}
String code = UUID.randomUUID().toString().substring(0,5) + "_" + System.currentTimeMillis();
//redis缓存验证码,用于注册验证和防刷(防刷)60秒内再次发送验证码)
redisTemplate.opsForValue().set(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone,code,5, TimeUnit.MINUTES);
thirdPartFeignService.sendCode(phone,code.split("_")[0]);
return R.ok();
}

2、openfeign远程呼叫发送短信controller:

3,上述服务controller中的SmsComponent:
package com.atguigu.gulimall.thirdparty.component;
import lombok.Data;
import org.apache.http.HttpResponse;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import com.atguigu.gulimall.thirdparty.utils.HttpUtils;
import java.util.HashMap;
import java.util.Map;
/**
* @author guanghaocheng
* @version 1.0
* 翅膀被灰尘和雾气稍稍补充。,蜡烛末端的光线增加了太阳和月亮的辉光。
* @date 2021/6/30 21:06
* 用于发送SMS的组件
*/
@ConfigurationProperties(prefix = "spring.cloud.alicloud.sms")
@Data
@Component
public class SmsComponent {
private String host;
private String path;
private String method;
private String appcode;
private String template_id;
private String expire_at;
public void sendSmsCode(String phone,String code){
Map headers = new HashMap();
//最后在header中的格式(中间是一个英语空间。)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
headers.put("Authorization", "APPCODE " + appcode);
//根据API要求,定义相应的Content-Type
headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
Map querys = new HashMap();
Map bodys = new HashMap();
bodys.put("content", "code:" + code + ",expire_at:" + expire_at);
bodys.put("phone_number", phone);
bodys.put("template_id", template_id);
try {
HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
System.out.println(response.toString());
//获取response的body
//System.out.println(EntityUtils.toString(response.getEntity()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
它是一个与阿里云集成的短信接口,httputils在我之前的文章中,您也可以转到ariyun文档提供的地址查看。
2.邮件验证码和防刷验证
这实际上和发短信一样
@ResponseBody
@GetMapping("/email/sendcode")
public R sendCodeForEmail(@RequestParam("email") String email){
String s = redisTemplate.opsForValue().get(AuthServerConstant.MAIL_CODE_CACHE_PREFIX + email);
if(!StringUtils.isEmpty(s)){
Long l = Long.parseLong(s.split("_")[1]);
if(System.currentTimeMillis() - l < 60000){
return R.error(BizCodeEnume.MAIL_CODE_EXCEPTION.getCode(),BizCodeEnume.MAIL_CODE_EXCEPTION.getMsg());
}
}
String code = UUID.randomUUID().toString().substring(0,5)+"_"+System.currentTimeMillis();
redisTemplate.opsForValue().set(AuthServerConstant.MAIL_CODE_CACHE_PREFIX + email,code,5,TimeUnit.MINUTES);
thirdPartFeignService.sendCodeForEmail(email,code.split("_")[0]);
return R.ok();
}
远程调用以发送邮件controller:

service:
/**
* 电子邮件验证码
* @param to
* @param code
*/
@Override
public void sendCode(String[] to, String code) throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
helper.setSubject("验证码");//标题
helper.setText("您的验证码是"+code+",有效期" + expire + "分钟",true);//内容,可使用html设置样式,但必须是。true,默认是false
helper.setFrom("1304058312@qq.com");//发送人
helper.setTo(to);
javaMailSender.send(mimeMessage);
} 版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123




