全网最新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实现验证码功能篇二(前后端分离)的主要内容,如果未能解决你的问题,请参考以下文章