瑞吉外卖手机验证码登录部分解决空指针和前端问题及如何使用阿里云发送验证码短信

短信部分我会放到分割线后进行讲解,首先是前端问题,之后是空指针,最后是短信发送

瑞吉外卖中前段部分应该进行如下修改

在resources\static\front\api\login.js里添加如下

function sendMsgApi(data) {
    return $axios({
        'url': '/user/sendMsg', //请求路径
        'method': 'post',  //请求方式
        data   //请求携带的参数
    })
}

在\resources\static\front\page\login.html里进行如下修改

在脚本部分的方法里进行修改,这样就可以达成手机号第一位是1,第二位是3578开头,剩下的位数0-9随意。

methods:{
                getCode(){
                    this.form.code = ''
                    const regex = /^1[3578]\d{9}$/;
                    console.log(this.form)
                    if (regex.test(this.form.phone)) {
                        alert(this.form.phone)
                        this.msgFlag = false
                        sendMsgApi({phone:this.form.phone})
                    }else{
                        this.msgFlag = true
                    }
                },
                async btnLogin(){
                    if(this.form.phone && this.form.code){
                        this.loading = true
                        const res = await loginApi({data:this.form})
                        this.loading = false
                        if(res.code === 1){
                            sessionStorage.setItem("userPhone",this.form.phone)
                            window.requestAnimationFrame(()=>{
                                window.location.href= '../index.html'
                            })                           
                        }else{
                            this.$notify({ type:'warning', message:res.msg});
                        }
                    }else{
                        this.$notify({ type:'warning', message:'请输入手机号码'});
                    }
                }
            }

在SMSUtils工具类下删除短信发送成功,这个会进入session,虽无大碍,但是用起来别扭 


在UserController里产生空指针异常可能有以下几种情况

第一种:没有添加注解

  

 

 第二种:注意要把phone改为带双引号

 

如果想查看session中的数据可以使用如下方法,复制粘贴进去即可,注意要放在session.setAttribute("phone",code)之后

//
//该部分用于打印session里的值
//
 获取session中所有的键值
//            Enumeration<?> enumeration = session.getAttributeNames();
 遍历enumeration中的
//            while (enumeration.hasMoreElements()) {
 获取session键值
//                String name = enumeration.nextElement().toString();
//                // 根据键值取session中的值
//                Object value = session.getAttribute(name);
//                // 打印结果
//                System.out.println("<B>" + name + "</B>=" + value + "<br>/n");
//            }

 接下来需要修改login中的代码,修改如下,复制粘贴使用即可,此方法是把map的转换为json数据进行存取,因为前端传来的json格式有问题,所以需要在以下代码进行优化处理

@PostMapping("/login")
    public R<User> login(@RequestBody Map userMap,HttpSession session){
        log.info(userMap.toString());
        JSONObject json = new JSONObject(userMap);
        log.info(json.toString());
        //获取手机号
        //String phone = userMap.get("phone").toString();
        String phone = (String) json.getJSONObject("data").get("phone");
        log.info(phone);
        //获取验证码   用户提交的验证码
        //String code = userMap.get("code").toString();
        String code = (String) json.getJSONObject("data").get("code");
        log.info(code);
        log.info(session.toString());
        for (Enumeration e = session.getAttributeNames(); e.hasMoreElements(); )
        {
            System.out.println(e.nextElement());
        }
        //获取session里的验证码  短信发送的验证码
        String sessionCode = session.getAttribute("phone").toString();

        //验证码对比
        if ( !(phone != null && code.equals(sessionCode)) ){
            return R.error("登录失败,用户名或密码不正确!");
        }else {
            //登录成功
            LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
            //添加条件查询数据库字段和当前字段是否相同
            qw.eq(User::getPhone,phone);
            //通过getOne获取唯一对象便于以后的注册存储
            User user = userService.getOne(qw);
            //判断当前是否为新用户
            if (user == null){
                //注册
                User userNew = new User();
                userNew.setPhone(phone);
                userNew.setStatus(1);
                userService.save(userNew);
                session.setAttribute("user",userNew.getId());
                return R.success(userNew);
            }
            else {
                //不是新用户
                session.setAttribute("user",user.getId());
                return R.success(user);
            }

        }
    }

接下来是如何发送阿里云短信

首先在阿里云进行注册,然后点击控制台

 之后点击黄色部分三条线

 搜索关键词短信服务,点击快速学习和测试

绑定测试手机号码

 

找到个人中心下有个Access Key管理,之后点击使用子账户

依次执行 创建用户组,添加权限,搜索SMS,两项全选,然后创建用户,创建后在用户里创建Access Key,之后再用户组添加用户,记得Access Key要在一个记事本记住,他只会出现一次,如果丢失了那么就重新创建一个Access key ,把丢失的那个禁用删除,这是很重要的

 

 

 

 上面部分弄完后接下来是代码部分

在SMSutils设置

 

public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
		DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou",
				"你的Access Key",
				"你的Access Key的密码");
		IAcsClient client = new DefaultAcsClient(profile);

		SendSmsRequest request = new SendSmsRequest();
		request.setSysRegionId("cn-hangzhou");
		request.setPhoneNumbers(phoneNumbers);
		request.setSignName("阿里云短信测试");
		request.setTemplateCode("在调用API那里的自己修改");
		request.setTemplateParam("{\"code\":\""+param+"\"}");
		try {
			SendSmsResponse response = client.getAcsResponse(request);
			//System.out.println("短信发送成功");
		}catch (ClientException e) {
			e.printStackTrace();
		}
	}

将这几个参数填入就可以流畅登录了,按照我的步骤和代码一点问题也不会有,如果还有什么问题请在下方评论留言,看到了我会解答,第一次创作,创作不易,如果帮助到你希望可以点个赞。 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值