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 相关文章推荐
redis 查看所有的key方式
May 07 Redis
为Java项目添加Redis缓存的方法
May 18 Redis
浅谈redis缓存在项目中的使用
May 20 Redis
详解Redis瘦身指南
May 26 Redis
Java Socket实现Redis客户端的详细说明
May 26 Redis
k8s部署redis cluster集群的实现
Jun 24 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
浅谈Redis的keys命令到底有多慢
Oct 05 Redis
Redis中有序集合的内部实现方式的详细介绍
Mar 16 Redis
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Mar 16 Redis
使用Redis实现分布式锁的方法
Jun 16 Redis
基于Redission的分布式锁实战
Aug 14 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
做个自己站内搜索引擎
2006/10/09 PHP
用PHP读取IMAP邮件
2006/10/09 PHP
PHP日期时间函数的高级应用技巧
2009/05/16 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
JS实现QQ图片一闪一闪的效果小例子
2013/07/31 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
2018/05/08 Javascript
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
vue响应式系统之observe、watcher、dep的源码解析
2019/04/09 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
[45:32]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
使用PyCharm进行远程开发和调试的实现
2019/11/04 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
销售行业个人求职自荐信
2013/09/25 职场文书
班组长的岗位职责
2013/12/09 职场文书
幼儿园实习自我鉴定
2013/12/15 职场文书
团组织关系介绍信
2014/01/12 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis