一,阿里云短信服务介绍
1,先注册账号
2,介绍
3,设置短信签名
4,设置短信模板
5,设置AccessKey
6,代码介绍
三,运用到项目中
1)需求分析
2)数据模型
3)交互过程
4)准备工作
以上略(但是注意添加相应注解)
//4-2,判断登录状态(移动端),如果已登录,直接放行
User user = (User) request.getSession().getAttribute("user");
if(user != null){
log.info("用户已登录,账号:{}",user.getName());
Long id = Thread.currentThread().getId();
log.info("线程id:{}",id);
//设置登录用户的id
BaseContext.setCurrentId(user.getId());
log.info("用户id是是:{}",BaseContext.getCurrentId());
filterChain.doFilter(request,response);
return;
}
//5,走到这里说明请求未放行 或 未登录
//通过输出流的方式将结果写到页面(写的是json数据)
//另外返回的提示中要与前端契合
log.info("用户未登录");
PrintWriter out = response.getWriter();
out.write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
发送短信验证码:
①前端:
②后端:由于没有购买阿里云的服务,不能将验证码通过短信的方式发送到手机上,只能通过控制台将验证码输出,待会儿登录的时候从控制台拿到一份即可
点击登录
①前端
②后端
*参数接收(每次测试都搞了不同的手机号和验证码,忽略其)
/**
* 移动端用户登录
* 可以像之前一样用DTO接收,创建一个UserDto继承User,再加入一个code成员变量
* 也可以用Map接收
* @return
*/
@PostMapping("/login")
public R<User> login(@RequestBody Map map,HttpSession session){
log.info(map.toString());
//获取手机号
String phone = map.get("phone").toString();
//获取验证码
String code = map.get("code").toString();
//从session中保存获取的验证码
Object codeInSession = session.getAttribute("phone");
//验证码的比对(在页面提交的验证码 和 保存在session中的验证码进行比对)
if(codeInSession != null && codeInSession.equals(code)){
//如果能比对成功,说明登录成功
//判断当前的手机号对应的用户是否是新用户,如果是新用户则自动完成注册
//拿该手机号到User表中查询即可
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
session.setAttribute("user",user);
return R.success(user);
}
return R.error("短信验证失败");
}
OK,验证成功!