Redis实现短信验证码登录的示例代码


Posted in Redis onJune 14, 2022

效果图

发送验证码

Redis实现短信验证码登录的示例代码

输入手机号、密码以及验证码完成登录操作

Redis实现短信验证码登录的示例代码

pom.xml

核心依赖

<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.7.22</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.2</version>
    </dependency>
</dependencies>

applicatoin.yml

server:
  port: 8080

spring:
  application:
    name: redis-lettuce
  datasource:
    url: jdbc:mysql://aliyun-rds.mysql.rds.aliyuncs.com/illness?useSSL=false
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    # useSSL : 一般通过证书或者令牌进行安全认证,否则通过账号和密码进行连接
  redis:
    database: 0  #Redis索引0~15,默认为0
    host: ip
    port: 6379
    password: 123456 #密码(默认为空)
    lettuce: # 这里标明使用lettuce配置
      pool:
        max-active: 8   #连接池最大连接数(使用负值表示没有限制)
        max-wait: -1ms  #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-idle: 5     #连接池中的最大空闲连接
        min-idle: 0     #连接池中的最小空闲连接
    timeout: 10000ms    #连接超时时间(毫秒)

Redis配置类

/**
 * Redis配置类
 *
 * @author issavior
 */
@Configuration
public class RedisConf {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {


        // 创建Template
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 设置序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();

        // key和 hashKey采用 string序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());

        // value和 hashValue采用 JSON序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);

        return redisTemplate;
    }
}

controller

/**
 * @author issavior
 */
@RestController
@RequestMapping("/user")
public class UserController {

    /**
     * userService
     */
    @Autowired
    private UserService userService;

    /**
     * 登录
     *
     * @param issa issa
     * @return ResponseEntity<Issa>
     */
    @PostMapping("/login")
    public ResponseEntity<Object> login(@RequestBody Issa issa) {

        return userService.login(issa);

    }

    /**
     * 获取验证码
     *
     * @param phone phone
     * @return ResponseEntity<Object>
     */
    @GetMapping("/{phone}")
    public ResponseEntity<Object> verificationCode(@PathVariable String phone) {

        return ResponseEntity.ok(userService.verificationCode(phone));
    }


    /**
     * 注册
     *
     * @param issa issa
     * @return ResponseEntity<Object>
     */
    @PostMapping
    public ResponseEntity<Object> register(@RequestBody Issa issa) {

        issa.setId(UUID.randomUUID().toString(true));

        return userService.register(issa);

    }

serviceImpl

/**
 * @author issavior
 */
@Service
@Slf4j
public class UserServiceImpl implements UserService {

    /**
     * redisTemplate
     */
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * userMapper
     */
    @Autowired
    private UserMapper userMapper;

    /**
     * 登录
     *
     * @param issa 登录的参数
     * @return ResponseEntity<Object>
     */
    @Override
    public ResponseEntity<Object> login(Issa issa) {

        Issa user = userMapper.getUser(issa);

        if (user == null) {
            return ResponseEntity.status(400).body("手机号或密码错误");
        }

        String phone = issa.getPhone();

        String verificationCode = (String) redisTemplate.opsForValue().get("login:" + phone);

        String verifyCode = issa.getVerifyCode();
        if (!Objects.equals(verifyCode, verificationCode)) {
            return ResponseEntity.status(400).body("请输入正确的验证码");
        }

        return ResponseEntity.ok("登录成功");
    }

    /**
     * 注册
     *
     * @param issa 注册的参数
     * @return ResponseEntity<Object>
     */
    @Override
    public ResponseEntity<Object> register(Issa issa) {

        int user = userMapper.insertUser(issa);

        if (user != 1) {
            return ResponseEntity.status(400).body("注册失败");
        }

        return ResponseEntity.ok("注册成功");
    }

    /**
     * 获取验证码
     *
     * @param phone 手机号
     * @return Object
     */
    @Override
    public Object verificationCode(String phone) {

        String randomCode = RandomUtil.randomNumbers(6);

        redisTemplate.opsForValue().set("login:" + phone, randomCode);
        log.info("验证码已经存入进redis服务器中:" + randomCode);

        String code = (String) redisTemplate.opsForValue().get("login:" + phone);
        if (code == null) {
            return "验证码获取失败";
        }

        return "验证码获取成功【 " + code + " 】";


    }
}

mapper

/**
 * @author issavior
 */
public interface UserMapper {

    /**
     * 新增用户&注册
     *
     * @param issa 参数
     * @return int:新增成功返回1,否则返回0
     */
    @Insert("insert into issa(id,user_name,password,nick_name,sex,age,phone) values (#{id},#{userName},#{password},#{nickName},#{sex},#{age},#{phone})")
    int insertUser(Issa issa);

    /**
     * 用于登录时,根据手机号和密码判断是否有相关用户
     *
     * @param issa issa
     * @return int
     */
    @Select("select * from issa where phone = #{phone} and password = #{password}")
    Issa getUser(Issa issa);
}

以上就是Redis实现短信验证码登录的示例代码的详细内容,更多关于Redis短信验证码登录的资料请关注三水点靠木其它相关文章!


Tags in this post...

Redis 相关文章推荐
Windows下redis下载、redis安装及使用教程
Jun 02 Redis
在redisCluster中模糊获取key方式
Jul 09 Redis
Redis集群新增、删除节点以及动态增加内存的方法
Sep 04 Redis
CentOS8.4安装Redis6.2.6的详细过程
Nov 20 Redis
redis数据结构之压缩列表
Mar 21 Redis
Redis安装使用RedisJSON模块的方法
Mar 23 Redis
基于Redis6.2.6版本部署Redis Cluster集群的问题
Apr 01 Redis
Redis超详细讲解高可用主从复制基础与哨兵模式方案
Apr 07 Redis
Redis 报错 error:NOAUTH Authentication required
May 15 Redis
Redis特殊数据类型HyperLogLog基数统计算法讲解
Jun 01 Redis
redis protocol通信协议及使用详解
Jul 15 Redis
Redis Lua脚本实现ip限流示例
Jul 15 Redis
Redis批量生成数据的实现
Jun 05 #Redis
Redis实现订单过期删除的方法步骤
Jun 05 #Redis
浅谈Redis缓冲区机制
Redis全局ID生成器的实现
Jun 05 #Redis
Redis keys命令的具体使用
Jun 05 #Redis
Redis入门基础常用操作命令整理
Jun 01 #Redis
Redis基本数据类型String常用操作命令
Jun 01 #Redis
You might like
在smarty中调用php内置函数的方法
2013/02/07 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
jQuery制作网页版选项卡
2016/07/28 Javascript
关于javascript的一些知识以及循环详解
2016/09/12 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Python3安装Pymongo详细步骤
2017/05/26 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
2020/02/28 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
2020/05/08 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
销售代表求职自荐信
2013/10/01 职场文书
给物业的表扬信
2014/01/21 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
公司员工活动策划方案
2014/08/20 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL