spring-data-redis 实现用户登录次数限制以及冻结时间重试机制
本周收到一个优化请求,是对一个web项目实现登录用户的安全性校验,也就是实现登录次数的限制以及重试次数用完之后间隔时间再次恢复登录的功能。
一、何为spring-data-redis?
详情可以直接访问官网:https://spring.io/projects/spring-data-redis
1)概述
Spring Data Redis 是更大的 Spring Data 系列的一部分,它提供了从 Spring 应用程序对 Redis 的轻松配置和访问。它提供了与商店交互的低级和高级抽象,使用户摆脱了对基础设施的担忧。
2)功能用到的部分特征
- RedisTemplate为执行各种 Redis 操作、异常翻译和序列化支持提供高级抽象。
- 原子计数器支持类。
3)maven 引入
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
二、实现思路及其实现
1)需求逻辑
用户登录,用户名或密码错误,失败次数+1;当达到设定登录最大次数,提示还有多久才能再次尝试,会有一个冻结时间。中间即使用户名密码正确,也不让进入系统。
2)需要用到的一些变量:
/*** 时间间隔(分钟)*/private static final int TIME_INTERVAL=1;/*** 登录失败重试次数上限*/private static final int FAILED_RETRY_TIMES = 6;/*** 冻结时间 单位:秒*/private static final int FREEZE_TIME = 5;/*** redis记录用户登录失败次数key*/private static final String USER_LOGIN_FAILED_COUNT = "USER:LOGIN:FAILED:COUNT:";
3)核心代码
/*** 剩余次数操作* @param key* @return*/private RedisAtomicInteger getRedisCounter(String key) {RedisAtomicInteger counter = new RedisAtomicInteger(key, stringRedisTemplate.getConnectionFactory());if (counter.get() == 0) {counter.expire(TIME_INTERVAL, TimeUnit.MINUTES);}return counter;}/*** 过期时间设置* @param key*/private void getRedisExpireTime(String key){stringRedisTemplate.opsForValue().set(key,key,FREEZE_TIME,TimeUnit.MINUTES);}
// 访问次数keyString key = USER_LOGIN_FAILED_COUNT + username;//冻结时间keyString keyTime = USER_LOGIN_FAILED_COUNT + username + FREEZE_TIME;
//获取计数时间
RedisAtomicInteger counter = getRedisCounter(key);//查看冻结时间,进行判定
Long expireTime = stringRedisTemplate.boundHashOps(keyTime).getExpire();if (counter.get() >= FAILED_RETRY_TIMES && expireTime > 0) {return ResultResponse.ofError("登录次数已达上线,请" + stringRedisTemplate.getExpire(keyTime, TimeUnit.MINUTES) + "分钟之后重试");}/ matchResult 对密码的逻辑校验// 密码不正确if (!matchResult) {String message;Integer remainingTimes = FAILED_RETRY_TIMES - counter.get();if (remainingTimes > 0) {if (remainingTimes.equals(FAILED_RETRY_TIMES)) {message = "密码错误";counter.getAndIncrement();} else {message = "密码错误,剩余重试次数" + (FAILED_RETRY_TIMES - counter.get()) + "次";counter.getAndIncrement();}} else {if (!stringRedisTemplate.hasKey(keyTime)) {getRedisExpireTime(keyTime);}message = "账户被锁定,请" + stringRedisTemplate.getExpire(keyTime, TimeUnit.MINUTES) + "分钟之后重试";}return ResultResponse.ofMessage(-1, message);}
三、实现效果展示
用户登录次数限制效果展示
spring-data-redis 实现用户登录次数限制以及冻结时间重试机制相关推荐
- Spring Boot使用Spring Data Redis操作Redis(单机/集群)
说明:Spring Boot简化了Spring Data Redis的引入,只要引入spring-boot-starter-data-redis之后会自动下载相应的Spring Data Redis和 ...
- 一文搞定 Spring Data Redis 详解及实战
转载自 一文搞定 Spring Data Redis 详解及实战 SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问 ...
- Spring Data Redis 实践
前言 Spring Data Redis是Spring Data大家族的一部分,提供了基于spring应用的简易配置与redis服务访问,它为存储与交互提供了低级(low-level)和高级的(hig ...
- Spring Data Redis 让 NoSQL 快如闪电(2)
2019独角兽企业重金招聘Python工程师标准>>> 把 Redis 当作数据库的用例 现在我们来看看在服务器端 Java 企业版系统中把 Redis 当作数据库的各种用法吧.无论 ...
- Spring Data Redis存储库
8. Redis存储库 使用Redis存储库允许在Redis哈希中无缝地转换和存储域对象,应用自定义映射策略并利用二级索引. Redis存储库至少需要Redis Server 2.8.0版. 8.1. ...
- Spring认证中国教育管理中心-Spring Data Redis框架教程三
原标题:Spring认证中国教育管理中心-Spring Data Redis框架教程三 10.15.支持类 Packageorg.springframework.data.redis.support提 ...
- Spring data redis 异常
2019独角兽企业重金招聘Python工程师标准>>> spring 集成 spring-data-redis 版本: spring低版本 + spring-data-redis 高 ...
- Spring Security默认的用户登录表单 页面源代码
Spring Security默认的用户登录表单 页面源代码 <html><head><title>Login Page</title></hea ...
- 使用Spring Data Redis操作Redis(集群版)
说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...
最新文章
- Linux下mysql备份
- 封装案例-创建士兵类-完成初始化方法
- Java高新技术笔记:反射、多线程、泛型、枚举、javaBean、代理
- mariadb数据库增删改查
- Hibernate-HQL基础
- artcore html5,值得收藏的25款免费响应式网页模板_CSS_网页制作
- Linux下软件实现raid
- 用户空间与内核空间数据交换的方式(3)------seq_file
- 初学C语言2--C语言项目的基本框架
- 创意字体设计,创意思路哪里找
- 小米8连续点击Android版本,极致模式已开启!小米MIUI8隐藏功能大盘点
- 《持续集成实践指南》第3章 Gitlab基本配置与使用
- python画太阳花代码
- python webdriver firefox 登录126邮箱,先添加联系人,然后进入首页发送邮件,带附件。...
- 给女朋友写一个微信小程序
- 接入支付宝支付SDK
- HttpEntity的类型及其使用(各种继承的使用)
- 从贝叶斯定理到概率分布:详解概率论基本定义
- json数组删除重复项
- 今日金融词汇--- 商业模式
热门文章
- [unity] build项目报错:Currently selected scripting backend (.NET)is not installed
- Java生成指定范围的随机数
- 智慧金融系统软件需求规格说明(3.20终版)
- 5G网络用户面时延测量
- JSD1806——8——SpringMVC
- iphone传输 android,安卓苹果数据互传,三种方法教你怎样把iPhone数据迁移到安卓手机...
- 通过Web Service实现IP地址查询功能
- 面试管:用了HTTPS就安全了吗?HTTPS 会被抓包吗?
- 互动送书-《MySQL DBA工作笔记》签名版
- IDEA中怎么调出右下角的版本控制Git