【瑞吉外卖】学习笔记-day5:(三)手机验证码登录(用邮件发送代替)

短信发送:

短信服务介绍

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

常用短信服务:

  • 阿里云
  • 华为云
  • 腾讯云
  • 京东
  • 梦网
  • 乐信

阿里云短信服务-介绍

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

应用场景:

  • 验证码
  • 短信通知
  • 推广短信

阿里云短信服务-注册账号

阿里云官网: https://www.aliyun.com/

点击官网首页注册按钮。

阿里云短信服务-设置短信签名

注册成功后,点击登录按钮进行登录。登录后进入短信服务页面:

 

要钱的...了解下就好...... 

设置短信签名:

开通了短信服务之后,进入短信服务管理页面,选择国内消息菜单,我们可以在这里添加短信签名

 

什么是短信签名?

  • 短信签名是短信发送者的署名,表示发送方的身份
  • 我们要调用阿里云短信服务发送短信,签名是必不可少的部分

添加短信签名方式
个人申请签名是有一定的难度的,我们只需要了解一下使用短信签名的具体流程

设置短信模板:

每一个被设置好的模板有一个短信模板详情,模板详情包含了模板的6条信息 

 可以自己添加模板,并且提交后审核

 

设置AccessKey

AccessKey 是访问阿里云 API 的密钥,具有账户的完全权限,我们要想在后面通过API调用阿里云短信服务的接口发送短信,那么就必须要设置AccessKey。

光标移动到用户头像上,在弹出的窗口中点击【AccessKey管理】︰

 进入到AccessKey的管理界面之后,提示两个选项:

  1. 继续使用AccessKey
  2. 开始使用子用户AccessKey

 我们选择第二项

区别:
如果选择的是继续使用选项,我们创建的是阿里云账号的AccessKey,是具有账户的完全权限,有了这个AccessKey之后,我们就可以通过API调用阿里云服务,不仅是短信服务,其他服务也可以调用。相对来说,并不安全,当前的AccessKey泄露,会影响到当前账户的其他云服务。
如果选择开始使用子用户AccessKey,可以创建一个子用户,这个子用户可以分配比较低的权限,比如仅分配短信发送的权限,不具备操作其他的服务的权限,即使这个AccessKey泄漏了,也不会影响其他的云服务, 相对安全。

后续操作省略......

修改成用QQ邮箱验证码登录:

导入依赖:

<!--mail短信依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

 resources下的yml添加配置:

spring:
  mail:
    host: smtp.qq.com
    #发送验证码的邮箱
    username: **********@qq.com
    # 你的QQ邮箱授权码
    password: ***********

 获取QQ邮箱授权码方法:

 

 

在账户页下拉找到POP3/SMTP服务开启获得授权码 

 然后把授权码编写到resources下的yml里即可

 代码开发:

1、Service层的UserService:

import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.reggie.entity.User;

public interface UserService extends IService<User> {
    //发送邮件
    void sendMsg(String to,String subject,String text);
}

2、UserServiceImpl实现类

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.mapper.UserMapper;
import com.itheima.reggie.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import com.itheima.reggie.entity.User;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
    //把yml配置的邮箱号赋值到from
    @Value("${spring.mail.username}")
    private String from;
    //发送邮件需要的对象
    @Autowired
    private JavaMailSender javaMailSender;
    //邮件发送人
    @Override
    public void sendMsg(String to, String subject, String text) {
        //发送简单邮件,简单邮件不包括附件等别的
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(text);
        //发送邮件
        javaMailSender.send(message);
    }
}

3、在拦截器LoginCheckFilter中放行验证码请求和登录请求

4、 UserController代码:

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @Autowired
    private UserService userService;
    //获取验证码
    @PostMapping("/sendMsg")
    public R<String> sendMsg(HttpSession session, @RequestBody User user){
        //获取邮箱号
        //相当于发送短信定义的String to
        String email = user.getPhone();
        String subject = "瑞吉外卖";
        //StringUtils.isNotEmpty字符串非空判断
        if (StringUtils.isNotEmpty(email)) {
            //发送一个四位数的验证码,把验证码变成String类型
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            String text = "【瑞吉外卖】您好,您的登录验证码为:" + code + ",请尽快登录";
            log.info("验证码为:" + code);
            //发送短信
            userService.sendMsg(email,subject,text);
            //将验证码保存到session当中
            session.setAttribute(email,code);
            return R.success("验证码发送成功");
        }
        return R.error("验证码发送异常,请重新发送");
    }
    //登录
    @PostMapping("/login")
    //Map存JSON数据
    public R<User> login(HttpSession session,@RequestBody Map map){
        //获取邮箱,用户输入的
        String phone = map.get("phone").toString();
        //获取验证码,用户输入的
        String code = map.get("code").toString();
        //获取session中保存的验证码
        Object sessionCode = session.getAttribute(phone);
        //如果session的验证码和用户输入的验证码进行比对,&&同时
        if (sessionCode != null && sessionCode.equals(code)) {
            //要是User数据库没有这个邮箱则自动注册,先看看输入的邮箱是否存在数据库
            LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(User::getPhone,phone);
            //获得唯一的用户,因为手机号是唯一的
            User user = userService.getOne(queryWrapper);
            //要是User数据库没有这个邮箱则自动注册
            if (user == null) {
                user = new User();
                user.setPhone(phone);
                user.setStatus(1);
                //取邮箱的前五位为用户名
                user.setName(phone.substring(0,6));
                userService.save(user);
            }
            //不保存这个用户名就登不上去,因为过滤器需要得到这个user才能放行,程序才知道你登录了
            session.setAttribute("user", user.getId());
            return R.success(user);
        }
        return R.error("登录失败");
    }
}

5、还需要修改前端一些界面

下载此front替换在你的项目即可:

链接:https://pan.baidu.com/s/12hbqPHFmcykc6qGJATHAaA?pwd=guiy 
提取码:guiy

测试时:如果输入验证码后登陆进去了然后马上闪退回登陆界面,请求都没问题的话,尝试着清理浏览器缓存试试~

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值