Redis實(shí)現(xiàn)短信驗(yàn)證碼登錄的示例代碼
效果圖
發(fā)送驗(yàn)證碼
輸入手機(jī)號(hào)、密碼以及驗(yàn)證碼完成登錄操作
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 : 一般通過(guò)證書(shū)或者令牌進(jìn)行安全認(rèn)證,否則通過(guò)賬號(hào)和密碼進(jìn)行連接 redis: database: 0 #Redis索引0~15,默認(rèn)為0 host: ip port: 6379 password: 123456 #密碼(默認(rèn)為空) lettuce: # 這里標(biāo)明使用lettuce配置 pool: max-active: 8 #連接池最大連接數(shù)(使用負(fù)值表示沒(méi)有限制) max-wait: -1ms #連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制) max-idle: 5 #連接池中的最大空閑連接 min-idle: 0 #連接池中的最小空閑連接 timeout: 10000ms #連接超時(shí)時(shí)間(毫秒)
Redis配置類(lèi)
/** * Redis配置類(lèi) * * @author issavior */ @Configuration public class RedisConf { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { // 創(chuàng)建Template RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); // 設(shè)置連接工廠 redisTemplate.setConnectionFactory(redisConnectionFactory); // 設(shè)置序列化工具 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); } /** * 獲取驗(yàn)證碼 * * @param phone phone * @return ResponseEntity<Object> */ @GetMapping("/{phone}") public ResponseEntity<Object> verificationCode(@PathVariable String phone) { return ResponseEntity.ok(userService.verificationCode(phone)); } /** * 注冊(cè) * * @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 登錄的參數(shù) * @return ResponseEntity<Object> */ @Override public ResponseEntity<Object> login(Issa issa) { Issa user = userMapper.getUser(issa); if (user == null) { return ResponseEntity.status(400).body("手機(jī)號(hào)或密碼錯(cuò)誤"); } 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("請(qǐng)輸入正確的驗(yàn)證碼"); } return ResponseEntity.ok("登錄成功"); } /** * 注冊(cè) * * @param issa 注冊(cè)的參數(shù) * @return ResponseEntity<Object> */ @Override public ResponseEntity<Object> register(Issa issa) { int user = userMapper.insertUser(issa); if (user != 1) { return ResponseEntity.status(400).body("注冊(cè)失敗"); } return ResponseEntity.ok("注冊(cè)成功"); } /** * 獲取驗(yàn)證碼 * * @param phone 手機(jī)號(hào) * @return Object */ @Override public Object verificationCode(String phone) { String randomCode = RandomUtil.randomNumbers(6); redisTemplate.opsForValue().set("login:" + phone, randomCode); log.info("驗(yàn)證碼已經(jīng)存入進(jìn)redis服務(wù)器中:" + randomCode); String code = (String) redisTemplate.opsForValue().get("login:" + phone); if (code == null) { return "驗(yàn)證碼獲取失敗"; } return "驗(yàn)證碼獲取成功【 " + code + " 】"; } }
mapper
/** * @author issavior */ public interface UserMapper { /** * 新增用戶&注冊(cè) * * @param issa 參數(shù) * @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); /** * 用于登錄時(shí),根據(jù)手機(jī)號(hào)和密碼判斷是否有相關(guān)用戶 * * @param issa issa * @return int */ @Select("select * from issa where phone = #{phone} and password = #{password}") Issa getUser(Issa issa); }
以上就是Redis實(shí)現(xiàn)短信驗(yàn)證碼登錄的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Redis短信驗(yàn)證碼登錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
redis stream 實(shí)現(xiàn)消息隊(duì)列的實(shí)踐
本文主要介紹了redis stream 實(shí)現(xiàn)消息隊(duì)列的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08redis中事務(wù)機(jī)制及樂(lè)觀鎖的實(shí)現(xiàn)
這篇文章主要介紹了redis中事務(wù)機(jī)制及樂(lè)觀鎖的相關(guān)內(nèi)容,通過(guò)事務(wù)的執(zhí)行分析Redis樂(lè)觀鎖,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10Redis之SDS數(shù)據(jù)結(jié)構(gòu)的使用
本文主要介紹了Redis之SDS數(shù)據(jù)結(jié)構(gòu)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08redis?for?windows?6.2.6安裝包最新步驟詳解
這篇文章主要介紹了redis?for?windows?6.2.6安裝包全網(wǎng)首發(fā),使用Windows計(jì)劃任務(wù)自動(dòng)運(yùn)行redis服務(wù),文章給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04淺談一下Redis的數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了淺談一下Redis的數(shù)據(jù)結(jié)構(gòu),簡(jiǎn)單字符串結(jié)構(gòu)被用于存儲(chǔ)redis的key對(duì)象和String類(lèi)型的value對(duì)象,其中的free和len字段可以輕松的使得在該字符串被修改時(shí)判斷是否需要擴(kuò)容,需要的朋友可以參考下2023-08-08如何利用Redis分布式鎖實(shí)現(xiàn)控制并發(fā)操作
這篇文章主要介紹了如何利用Redis分布式鎖實(shí)現(xiàn)控制并發(fā)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Redis的數(shù)據(jù)復(fù)制過(guò)程詳解
Redis 的復(fù)制功能分為同步(sync)和命令傳播(command propagate)這兩個(gè)操作,這篇文章主要介紹了Redis的數(shù)據(jù)復(fù)制,需要的朋友可以參考下2022-12-12