短信验证码/邮箱验证码的发送及防刷校验

一、发送短信验证码及接口防刷

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);
    }

Guess you like

Origin blog.csdn.net/qq_42969135/article/details/118440078