Springboot注册+验证码

发布于 2021-04-10  557 次阅读


使用Springboot实现项目的注册和验证码功能,差不多花了三个小时,特此记录!

首先,思路:我们要实现注册功能,无非是用户点击注册按钮,跳转到注册页面,然后填写信息,接着发送验证码,用户填写验证码,成功写入数据库这几步

因此验证码这个东西,具有时效性,比如三分钟有效,五分钟有效,然后它不应该留在数据库里我们去手动删除,因此选用Redis缓存来实现再合适不过,我们可以设置其失效时间redisTemplate.opsForValue().set(redisKey,code,300, TimeUnit.SECONDS),过期之后会自动消失;

那么我们细化一下实现流程:

1.用户点击注册按钮跳转到注册页面

2.填写信息,点击发送验证码

3.发送验证码的同时,将验证码写入Redis缓存并设置过期时间

4.用户填写验证码,后台接收并进行验证

5.如果验证码正确,写入数据库并放行,否则提示重新验证

 

了解了实现流程,我们开始编写代码:

首先实体类,User

/**
* 实体类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Repository
public class User {
private int id;
private String name;
private String pwd;
}

定义InsertController类
定义InsertController类模拟接收前端传参,然后调用验证码发送模块

/**
* 模拟前端传参,调用验证码发送
*/
@Controller
public class InsertController {

@Autowired
RegsentController regsentController;

@RequestMapping("/insert")
@ResponseBody
public String insert(User user,RedisTemplate redisTemplate) {
//接收参数后,发送短信,返回的是该用户验证码在Redis里的key
String userKey = regsentController.sendmessage(user,redisTemplate);
return userKey;
}
}

定义RegsentController类
调用生成随机码的方法(getCode)和发送给前端用户的方法(send)

/**
 *接收前端传来的参数并发送验证码
 * 保存到Redis里
 * 返回该用户存进Redis里验证码的key
 */
@Controller
public class RegsentController {

    @ResponseBody
    public String sendmessage(User user,RedisTemplate redisTemplate){
        //这里的userId在真实业务中通过个人身份的令牌获取
        //生成六位数随机验证码
        String code=getCode();
        //设置redis的key,这里设置为用户Id
        String redisKey=""+user.getId();
        //将这个验证码存入redis中,并设置失效时间为5分钟
        redisTemplate.opsForValue().set(redisKey,code,300, TimeUnit.SECONDS);
        //发送短信
        boolean isSuccess=send(code);
        if (isSuccess){
            System.out.println("成功发送");
            return redisKey;
        }
        return null;
    }
    private boolean send(String code) {
        String msg="验证码为:"+code+",验证码有效期5分钟,请及时验证";
        System.out.println(msg);
        return true;
    }
    //生成六位随机验证码
    private static String getCode() {
        Random random = new Random();
        String result="";
        for (int i=0;i<6;i++)
        {
            result+=random.nextInt(10);
        }
        return result;
    }
}

定义RegVerification类

RegVerfication用于完成用户输入的验证码和Redis里的正确验证码的对比,并调用Mapper写入数据库(这里应该拆分成几个service,由于是测试就不细化了)

/**
 *接收前端传来的验证码
 * 与Redis里保存的value进行对比
 * 相同则写入数据库
 * 否则提示出错
 * @param Key 用户验证码在Redis里保存的键名
 * @param scan_code 是用户输入的验证码
 * @param redisTemplate 处理Redis
 * @param user 需要写入数据库的对象
 */

@Controller
public class RegVerification {

    @Autowired
    UserMapper userMapper;
    @ResponseBody
    public void Verfication(String key, String scan_code, RedisTemplate redisTemplate, User user){
        //进行对比
        String o = (String) redisTemplate.opsForValue().get(key);
        System.out.println("Redis中存储的正确的验证码为:"+o);
        System.out.println("用户输入的验证码为:"+scan_code);
        if(o.equals(scan_code)) {
            System.out.println("验证码正确");
            //调用Mapper写入数据库
            userMapper.insert(user);
            System.out.println("插入数据库成功!恭喜您成功注册!");
        }
        else System.out.println("很抱歉,您的验证码有误,请重试");
    }
}

定义Mapper接口
//@Mapper这个注解表示了这是一个mybatis的mapper类
//@Repository表示其为Dao层(@Component万能)的Bean

/**
 * UserMapper接口
 */
@Mapper
@Repository
public interface UserMapper {

    //注册功能,添加用户
    void insert(User user);
}

定义Mapper接口的实现文件UserMapper.xml
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--绑定命名空间-->
<mapper namespace="com.yang.Mapper.UserMapper">

    <select id="insert" parameterType="com.yang.Pojo.User">
          insert into redisname (id,name,pwd) values (#{id},#{name},#{pwd})
    </select>

</mapper>

定义测试类ApplicationTests
/**
 * 测试类
 */
@SpringBootTest
class ApplicationTests {

    @Autowired
    InsertController insertController;
    @Autowired
    RegVerification regVerification;
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    @Autowired
    User user;
    @Test
    void contextLoads() {
        //自定义user,模拟前端传参
        user.setId(10);
        user.setName("十号玫瑰");
        user.setPwd("9973");
        //发送验证码
        String userKey = insertController.insert(user,redisTemplate);
        //获取键
        System.out.println("用户验证码在Redis中的键为:"+10);
        //模拟前端:用户输入验证码
        String scan_code ="386247";
        //将usrKey传给ResVerification,供其对比userKey对应的正确的code和用户自己输入的scan_code
        regVerification.Verfication("10", scan_code, redisTemplate,user);
    }
}

开始测试:
因为前端传参我们是模拟的,每次执行测试类我们都会发送验证码,因此为了验证我们是否插入成功,要把发送验证码语句注释掉,如图
可以看到,当我们没有将其注释掉的时候,生成验证码386247

注释之后

成功注册!!!

她喜欢所以就做咯