1.相关依赖导入
<!-- Redis,java1.8的rt jar包有工具目录下util自带UUID相关工具类 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.UUID生成验证码
public static String getCapthCode()
{
return getCodeByUUId().substring(6);
}
public static String getCodeByUUId()
{
int value = UUID.randomUUID().toString().hashCode();
if (value < 0) {
value = -value;
}
//0代表前面补充0,10代表长度,d代表正整数
String orderId = String.format("%010d", value);
return orderId;
}
3.获取发送手机验证码并存入redis
/**
* 获取发送手机验证码
*/
@GetMapping(value = "/captchaSms")
@ResponseBody
public boolean captchaSms(String loginName)
{
// 当验证码失效才进行操作
if(redisUtil.get(loginName) == null){
String code = CodeUtil.getCapthCode();
// 将验证码限制参数放到缓存里 10分钟过期,10分钟后才能再次发短信
redisUtil.set(loginName, code , 60 * 10 * 10);
JSONObject obj = new JSONObject();
obj.put("code", code);
logger.info("短信验证码==>"+code);
// 云信短信
DySmsUtil.sendSms(loginName, obj);
return true;
}else{
logger.info("短信验证码==>"+redisUtil.get(loginName));
return false;
}
}
4.用户输入验证码后校验
/**
* 手机注册/登录
*/
@PostMapping("/thirdRegister")
@ResponseBody
public AjaxResult thirdRegister(HttpServletRequest request,
@RequestBody SysUser user)
{
String msg = "登录成功";
if (StringUtils.isEmpty(user.getLoginName()) || StringUtils.isEmpty(user.getCaptcha())){
msg = "用户名/验证码不能为空";
return error(msg);
}
// 首先验证验证码是否正确
if(redisUtil.get(user.getLoginName()) == null || !redisUtil.get(user.getLoginName()).equals(user.getCaptcha())){
msg = "验证码过期/错误";
return error(msg);
}
// 验证码正确则判断是否为新用户
SysUser sysUser = userService.selectUserByLoginName(user.getLoginName());
// 是新用户,创建用户
if(sysUser == null){
sysUser = new SysUser();
sysUser.setPcode(user.getPcode());
sysUser.setLoginName(user.getLoginName());
sysUser.setUserName(user.getLoginName());
sysUser.setPassword(user.getLoginName());
sysUser.setPhonenumber(user.getLoginName());
sysUser.setSalt(ShiroUtils.randomSalt());
sysUser.setPassword(passwordService.encryptPassword(sysUser.getLoginName(), sysUser.getPassword(), sysUser.getSalt()));
webIndexService.registerSave(sysUser);
}
// 获取token
String jwtToken = JwtUtils.createToken(sysUser.getLoginName(),sysUser.getPassword());
sysUser.setJwtToken(jwtToken);
AjaxResult ajaxResult = new AjaxResult(AjaxResult.Type.SUCCESS,msg,sysUser);
return ajaxResult;
}
5.配置短信相关api和测试类
package com.ruoyi.common.utils.sms;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.http.HttpUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @Description: 云信短信接口
* @author: zy
* @date: 2021年03月30日 11:43
*/
public class DySmsUtil {
private final static Logger logger= LoggerFactory.getLogger(DySmsUtil.class);
public static boolean sendSms(String phone, JSONObject paramJson){
boolean result = true;
// 换成自己的
String url = "http://api.sms.cn/sms";
try {
String str = HttpUtils.sendPost(url,
"ac=send&uid=222&pwd=233232323" +
"&template=12222&mobile="+phone+"&content="+paramJson);
logger.info("短信接口返回的数据----------------"+str);
}catch (Exception e){
result = true;
logger.info("短信接口返回异常----------------"+e.getMessage());
}
return result;
}
public static void main(String[] args) {
JSONObject obj = new JSONObject();
obj.put("code", "1234");
sendSms("18720989281", obj);
}
}
6.密码登录
/**
* 密码登录 Json参数
*/
@PostMapping("/thirdLogin")
@ResponseBody
public AjaxResult ajaxThridLogin(HttpServletRequest request,
@RequestBody SysUser user)
{
String msg = "用户不存在/密码错误";
// 判断是不是手机号码
if (!user.getLoginName().matches(UserConstants.MOBILE_PHONE_NUMBER_PATTERN) || StringUtils.isEmpty(user.getPassword()))
{
return error(msg);
}
UsernamePasswordToken token = new UsernamePasswordToken(user.getLoginName(), user.getPassword());
Subject subject = SecurityUtils.getSubject();
try
{
subject.login(token);
SysUser sysUser = ShiroUtils.getSysUser();
// 获取token
String jwtToken = JwtUtils.createToken(sysUser.getLoginName(),sysUser.getPassword());
sysUser.setJwtToken(jwtToken);
AjaxResult ajaxResult = new AjaxResult(AjaxResult.Type.SUCCESS,"登录成功",sysUser);
return ajaxResult;
}
catch (AuthenticationException e)
{
if (com.ruoyi.common.utils.StringUtils.isNotEmpty(e.getMessage()))
{
msg = e.getMessage();
}
return error(msg);
}
}
其它相关实体类在包中,需要自取