全网最新Redis结合Kaptcha实现验证码功能篇二(前后端分离)

Posted DT辰白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全网最新Redis结合Kaptcha实现验证码功能篇二(前后端分离)相关的知识,希望对你有一定的参考价值。


前言

Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。


一、引入依赖

<!--redis依赖包-->
<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>

二、配置yam

  spring:
	  redis:
	    ###################以下为redis单机模式配置###########################
	    host: 127.0.0.1     # Redis服务器地址
	    port: 6379          # Redis服务器连接端口
	    database: 0         # Redis数据库索引(默认为0)
	    password:           # Redis服务器连接密码(默认为空)
	    timeout: 3000       # 连接超时时间(毫秒)
	    lettuce: # Redis的Java驱动包,使用lettuce连接池
	      pool:
	        max-active: 200 # 连接池最大连接数(使用负值表示没有限制)
	        max-wait: -1    # 连接池最大阻塞等待时间(使用负值表示没有限制)
	        max-idle: 10    # 连接池中的最大空闲连接 (默认为8)
	        min-idle: 0     # 连接池中的最小空闲连接

三、使用步骤

3.1 Redis序列化配置类

@Configuration
public class RedisConfig {
    
    /**
     * 自定义序列化机制
     * @param connectionFactory
     * @return
     */
    @Bean(name = "redisTemplateCustomize")
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(connectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

3.1 写入key测试

@SpringBootTest
class SpringbootDemoApplicationTests {

    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;

    @Test
    void contextLoads() {
        // 写入一个key,value为101
        redisTemplate.opsForValue().set("dt", "101");
        // 读取key的值
        System.out.println(redisTemplate.opsForValue().get("dt"));
    }

}

在这里插入图片描述

3.2 将验证码存入Redis中

在这里插入图片描述
查看结果:

在这里插入图片描述

在这里插入图片描述

 // 存入redis(设置过期时间1分钟)
 redisTemplate.opsForValue().set(Constants.KAPTCHA_SESSION_KEY, randomText,60, TimeUnit.SECONDS);

Constants.KAPTCHA_SESSION_KEY是kaptcha内置提供的变量:
在这里插入图片描述
TimeUnit.SECONDS是Java类:JavaAPI的时间粒度单位枚举类型有如下几种

MICROSECONDS    微秒   一百万分之一秒(就是毫秒/1000)
MILLISECONDS    毫秒   千分之一秒    
NANOSECONDS   毫微秒  十亿分之一秒(就是微秒/1000)
SECONDS          秒
MINUTES     分钟
HOURS      小时
DAYS      天

3.3 登录获取验证码比对

上面我是可以存入数据库了,下面我们来分析一下业务,验证码有过期时间,如果登录提交的时候查询到的验证码不存在,那么就重新生成验证码。

1、安装axios

安装axios

npm install axios
import axios from "axios";

2、编写页面接口

 <el-form-item>
   <el-button @click="loginFun()" type="button" class="dt_button">登录系统</el-button>
</el-form-item>
// 登录
loginFun() {
    let _this = this
    if(_this.userForm.code == null){
        alert("请输入验证码!")
        return false
    }
    axios.post('http://localhost:8081/api/login', {
        code: _this.userForm.code
    })
    .then(function (res) {
        if(res.data.code === 5001){
            alert(res.data.msg)
        }else if(res.data.code === 5000){
            alert(res.data.msg)
        }else {
            alert(res.data.msg)
        }
        console.log(res);
    })
    .catch(function (error) {
        console.log(error);
    });
}

3、登录接口

/**
* 模拟登录
* @param code
* @return
*/
@PostMapping("/login")
public JSONObject login(String code){
   JSONObject json = new JSONObject();
   // 查询redis中是否有值
   String object = (String) redisTemplate.opsForValue().get(Constants.KAPTCHA_SESSION_KEY);
   if(StringUtils.isNotBlank(object)){
       // 输入的验证码是否和redis中一致
       if(object.equals(code)){
           // 验证有效时间
           Long expire = redisTemplate.boundHashOps(Constants.KAPTCHA_SESSION_KEY).getExpire();
           System.out.println("expire->>>"+expire);
           if (expire < 0L){
               json.put("code","5000");
               json.put("msg","验证码已过期!");
               return json;
           }
       }else {
           json.put("code","5001");
           json.put("msg","输入验证码不正确!");
           return json;
       }
   }else {
       json.put("code","5000");
       json.put("msg","验证码已过期!");
       return json;
   }

   // TODO 数据库验证账号密码
   json.put("code","2000");
   json.put("msg","登录成功!");
   return json;
}

在这里插入图片描述
输入过期的验证码:

在这里插入图片描述
到这里本篇文章就结束了,喜欢的小伙伴点个赞吧!

总结

希望对大家有帮助,下面还会出一些关于验证功能的干货文章,比如条形码的生成,二维码的生成,这些都是企业常用的干货。

以上是关于全网最新Redis结合Kaptcha实现验证码功能篇二(前后端分离)的主要内容,如果未能解决你的问题,请参考以下文章

java后台验证码工具

基于 Kaptcha 验证码检验的登录就该这么实现

java 实现登录验证码 (kaptcha 验证码组件)

shop--6.店铺注册--使用kaptcha实现验证码

Kaptcha实现验证码

Kaptcha实现验证码