手机号验证码/邮箱密码的发送及防刷核对

原创
小哥 3年前 (2022-11-08) 阅读数 7 #大杂烩

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);
    }
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除