一、发送短信验证码及接口防刷
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
* 发送手机短信的组件
*/
@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<String, String> headers = new HashMap<String, String>();
//最后在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<String, String> querys = new HashMap<String, String>();
Map<String, String> bodys = new HashMap<String, String>();
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在我之前的文章中有,也可以去阿里云文档给出地址中去查看。
二、邮件验证码及防刷校验
与发短信的其实一样
@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("<b>您的验证码为<span style='color:red;'>"+code+"</span>,有效期" + expire + "分钟</b>",true);//内容,可以用html设置样式,但是必须是true,默认是false
helper.setFrom("[email protected]");//发送人
helper.setTo(to);
javaMailSender.send(mimeMessage);
}