当前位置: 首页 > news >正文

手机验证码

一 : Controller层的方法

        1. @Autoeired 去service的注解

@Autowired
    private UserService userService;

        2. 去登录页面

/**
     * 去登录页面
     * @return
     */
    @RequestMapping("toLogin")
    public String login(){
        return "/login";
    }

        3. 发送验证码的方法

/**
     * 发验证码
     * @param userPhone
     * @return
     */
    @RequestMapping("loginSmsCode")
    @ResponseBody
    public BaseResponse loginSmsCode(String userPhone){
        //调用service发送验证码的方法
        return userService.loginSmsCode(userPhone);
    }

        4.登录的方法

/**
     * 登录的方法
     * @param user
     * @return
     */
    @RequestMapping("login")
    @ResponseBody
    public BaseResponse login(@RequestBody User user){
        //调用service层 登录的方法
        return userService.login(user);
    }

二 : service层方法

        1. @Autoeired 去mapper层的注解

@Autowired
    private UserMapper userMapper;

        2. http注解 用来存做session

@Autowired
    private HttpServletRequest request;

        3.发送验证码的方法

        1. 获取redis 
        2. 存入验证码的key 用手机号拼接, 保证key的唯一性
                ①: 存入验证码的key 用手机号拼接, 保证key的唯一性
                ②: 存入时间戳的key 用手机号拼接, 保证key的唯一性
         3. 判断有没有这个手机号
        4. 调用mapper层发送验证码的方法
        5. 判断手机号填写是否正确 (手机号已经有了的情况下,看看用户输入的对不对)
        6. 对此次验证码的次数进行判断, 如果时间为空, 则为第一次发送, 不用校验
                是不是恶意发送, 如果小于1分钟, 则为1分钟内多次发送, 直接退出
        7. 获取上一次发送的时间
        8. 判断时间是不是空的 
                ① : 获取当前的时间 
                ② : 当前的时间 - 上一次发送的时间 
                ③ : 判断 毫秒值 是否小于一分钟
        9. 获取随机数
        10. 调用阿里云工具类,发送验证码
        11. 判断验证码是否发送成功
        12. 将发送过来的验证码 存到 redis 中 (存进去 用set )
        13. 发送成功给出提示
/**
     * 发送验证码
     * @param userPhone
     * @return
     */
    @Override
    public BaseResponse loginSmsCode(String userPhone) {
        //获取redis
        JedisPool jedisPool = RedisConfig.jedisPool();
        Jedis jedis = jedisPool.getResource();

        //存入验证码的key 用手机号拼接 ,保证key的唯一性
        String SmsCodeKey = "Code"+userPhone;
        //存入时间戳的key 用手机号拼接 ,保证key的唯一性
        String timeKey = "time"+userPhone;

        //判断有没有这个手机号
        if (null == userPhone){
            return ResponseUtil.error("手机号不能为空");
        }

        //调用mapper层 发送验证码的方法
        User user = userMapper.loginSmsCode(userPhone);

        //判断手机号是否填写
        if (null == user){
            return ResponseUtil.error("手机号输入不正确,请重新输入");
        }

        //对此次验证码的次数进行判断,  如果时间为空,则为第一次发送, 不用家宴是否恶意发送
        //如果时间小于 1 分钟, 则一分钟之内多次发送, 直接退出
        //获取上一次发送的时间  获取是用 get 方法
        String s = jedis.get(timeKey);

        //判断时间不是空的
        if (null != s ){
            //获取当前时间
            long timeMillis = System.currentTimeMillis();
            //当前时间 - 上一次发送的时间
            Long l = timeMillis-Long.valueOf(s);
            //判断
            if (l<60*1000){
                ResponseUtil.error("小于一分钟,请重新发送");
            }
        }

        //获取随机数
        String smsCode = CodeGeneratorUtil.generateSmsCode();

        //调用工具类  ,用阿里云发送验证码
        String sentSms = SendMsgUtil.sendSms(userPhone,smsCode);

        //判断验证码是否发送成功
        if (!sentSms.equals("OK")){
            ResponseUtil.error("验证码发送失败");
        }

        //将验证码存入redis中 并设置过期时间
        jedis.setex(SmsCodeKey,60,smsCode);

        //将验证码发送的时间 存入redis中
        jedis.set(timeKey,String.valueOf(System.currentTimeMillis()));

        //发送成功给出提示
        return ResponseUtil.success("验证码发送成功");
    }

        4.登录的方法

                1. 获取redis

                2. 对实体类进行判断

                3. 对手机号进行判空处理

                4. 对验证码判空处理

                5. 把redis中存验证码取出来

                6. 判断是否频繁发送

                7. 调用mapper层登录方法

                8. 判断手机号是否存在

                9. 关闭资源

                10. 存session

                11. 登录成功给出提示

相关文章:

  • 组合 力扣77
  • 3.14-进程间通信
  • LeetCode 第8题:字符串转换整数 (atoi)
  • 【最后203篇系列】016 Q201架构思考
  • vue 导航跳转created不执行,页面不刷新的解决办法
  • Web自动化测试框架
  • 虚拟电商-数据库分库分表(二)
  • CockroachDB MCP -cursor适用
  • 搞定python之六----文件读写
  • 基于深度学习的蛀牙智能检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
  • Vue2+Vant2 项目初学
  • 计算机是如何工作的
  • DeepSeek 本地化新篇章:Ollama 兼容 OpenAI API 的深度解析与部署实践
  • 【DeepSeek】本地部署DeepSeek的完整教程(Ollama+Docker+Open WebUI)
  • 程序化广告行业(18/89):交易模式与关键概念解析
  • 多线程到底重不重要?
  • Qt 绘图
  • 在线 SQL 转 Python ORM工具
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_10空状态的固定表头表格
  • 【Git学习笔记】Git结构原理及其分支管理模型分析
  • 五一“大车流”来了,今日午后G40沪陕高速开始迎来出沪高峰
  • 智能终端出海服务创新联合体成立
  • 复星医药换帅:陈玉卿接棒吴以芳任董事长,吴以芳改任复星国际执行总裁
  • 绿地控股:今年一季度营业收入356亿元,中高层管理人员带头降薪
  • 王毅:妥协退缩只会让霸凌者得寸进尺
  • 十四届全国人大常委会举行第四十三次委员长会议 ,听取有关草案和议案审议情况汇报