短信服务在项目中的配置及如何实现验证码登录

短信发送

短信服务介绍

目前市面上有很多第三方提供的短信服务,这些第三方短信服务会和各个运营商(移动、联通、电信)对接,我们只需要注册成为会员并且按照提供的开发文档进行调用就可以发送短信。需要说明的是,这些短信服务一般都是收费服务。

阿里云短信服务

阿里云短信服务(Short Message Service)是广大企业客户快速触达手机用户所优选使用的通信能力。调用API或用群发助手,即可发送验证码、通知类和营销类短信;国内验证短信秒级触达,到达率最高可达99%;国际/港澳台短信覆盖200多个国家和地区,安全稳定,广受出海企业选用。
应用场景:验证码 短信通知 推广新闻

第一步:设置短信签名
短信签名是短信发送者的署名,表示发送方的身份
在这里插入图片描述
第二步:切换到模板管理
短信模板包含信息发送内容、场景、变量信息
在这里插入图片描述
上述的操作均需要人工审核通过的
第三步:设置AccessKey
当你程序要访问阿里云的短信服务的时候是需要用此密码来进行验证的
在这里插入图片描述
在这里插入图片描述
第四步:创建用户
在这里插入图片描述
第五步:设置权限
在这里插入图片描述
那么经历过上述操作我们的授权操作就成功了,但注意的是当我们的AccessKey被泄露出去之后,别人就可以那我们的AccessKey来发送短信并且扣的钱还是我们的钱,所以我们此时就要收回key,这个key就作废了


验证码示例代码

导入依赖

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>4.5.16</version>
</dependency>

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
  <version>2.1.0</version>
</dependency>

准备工作
第一步:创建实体类

/**
 * 用户信息
 */
@Data
public class User implements Serializable {
    
    

    private static final long serialVersionUID = 1L;

    private Long id;


    //姓名
    private String name;


    //手机号
    private String phone;


    //性别 0 女 1 男
    private String sex;


    //身份证号
    private String idNumber;


    //头像
    private String avatar;


    //状态 0:禁用,1:正常
    private Integer status;
}

第二步:创建mapper

@Mapper
public interface UserMapper extends BaseMapper<User> {
    
    
}

第三步:创建Service

public interface UserService extends IService<User> {
    
    
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    
    
}

第四步:创建Controller

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    
    
    @Autowired
    private UserService userService;

}

第五步:导入短息发送工具类和生成验证码工具类

/**
 * 短信发送工具类
 */
public class SMSUtils {
    
    

    /**
    * 发送短信
    * @param signName 签名
    * @param templateCode 模板
    * @param phoneNumbers 手机号
    * @param param 参数
    */
    public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
    
    
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", "");
        IAcsClient client = new DefaultAcsClient(profile);

        SendSmsRequest request = new SendSmsRequest();
        request.setSysRegionId("cn-hangzhou");
        request.setPhoneNumbers(phoneNumbers);
        request.setSignName(signName);
        request.setTemplateCode(templateCode);
        request.setTemplateParam("{\"code\":\""+param+"\"}");
        try {
    
    
            SendSmsResponse response = client.getAcsResponse(request);
            System.out.println("短信发送成功");
        }catch (ClientException e) {
    
    
            e.printStackTrace();
        }
    }

}
/**
 * 随机生成验证码工具类
 */
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);//生成随机数,最大为9999
            if(code < 1000){
    
    
                code = code + 1000;//保证随机数为4位数字
            }
        }else if(length == 6){
    
    
            code = new Random().nextInt(999999);//生成随机数,最大为999999
            if(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;
    }
}

开始配置
第一步:修改过滤器
在这里插入图片描述
在这里插入图片描述

第二步:编写Controller文件

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    
    
    @Autowired
    private UserService userService;

    //发送手机短信验证码
    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpSession session){
    
    
        //获取手机号
        String phone = user.getPhone();

        if(StringUtils.isNotEmpty(phone)){
    
    
            //生成随机的四位验证码
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            log.info("code={}",code);

            //调用阿里云提供的短信服务API完成发送短信
            //SMSUtils.sendMessage("瑞吉外卖","",phone,code);

            //需要将生成的验证码保存到session
            session.setAttribute(phone,code);

            return R.success("手机验证码发送成功");
        }
        return R.error("短信发送失败");
    }

    @PostMapping("/login")
    public R<User> login(@RequestBody Map map,HttpSession session){
    
    
        //获取手机号
        String phone = map.get("phone").toString();

        //获取验证码
        String code = map.get("code").toString();
        //从Session中获取保存的验证码
        Object codeInSession = session.getAttribute(phone);
        //进行验证码的比对
        if(codeInSession!=null && codeInSession.equals(code)){
    
    
            //如果能够比对成功,说明登录成功
            LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(User::getPhone,phone);
            User user = userService.getOne(queryWrapper);
            if(user==null){
    
    
                //判断当前手机号对应的用户是否是新用户,如果是新用户完成自动注册
                user = new User();
                user.setPhone(phone);
                user.setStatus(1);
                userService.save(user);
            }
            session.setAttribute("user",user.getId());
            return R.success(user);
        }
        return R.error("短信发送失败");
    }
}

猜你喜欢

转载自blog.csdn.net/m0_62434717/article/details/129866529