实名认证次数限制
在业务层实现实名认证次数限制
这个功能是通过以下步骤实现实名认证的次数限制:
- 每日失败尝试次数限制:限制用户每天可以尝试失败的次数。
- 失败后的冷却时间:用户在连续失败几次后需要等待一段时间才能再次尝试。
- 成功认证后的限制:一旦用户成功完成实名认证,他们将在一段时间内不能重复认证。
技术栈
- Spring Boot:作为项目的基础框架。
- Redis:用于存储认证状态和计数器。
实现细节
1. 每日失败尝试次数限制
为了限制用户每天可以尝试失败的次数,需要在Redis中存储每个用户的失败尝试次数,并确保每天午夜重置这些计数器。
代码示例
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;@Service
public class RealNameAuthService {private static final String DAILY_FAIL_COUNT_KEY_PREFIX = "real_name_auth_fail_count:";private static final int MAX_DAILY_FAIL_ATTEMPTS = 5; // 最大失败次数@Autowiredprivate StringRedisTemplate redisTemplate;public boolean checkDailyFailCount(String userId) {LocalDate today = LocalDate.now();String key = DAILY_FAIL_COUNT_KEY_PREFIX + userId + ":" + today;String failCountStr = redisTemplate.opsForValue().get(key);int failCount = !StringUtils.hasText(failCountStr) ? 0 : Integer.parseInt(failCountStr);if (failCount >= MAX_DAILY_FAIL_ATTEMPTS) {return false; // 达到最大失败次数}redisTemplate.opsForValue().increment(key, 1);redisTemplate.expireAt(key, Date.from(today.plusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant()));return true;}
}
2. 失败后的冷却时间
为了确保在失败尝试之后有一定的冷却时间,可以在Redis中设置失败尝试计数器的过期时间。
代码示例
private static final long COOL_DOWN_PERIOD = 5 * 60 * 1000; // 冷却时间(毫秒)public boolean checkCoolDownPeriod(String userId) {String key = DAILY_FAIL_COUNT_KEY_PREFIX + userId;Long failCount = redisTemplate.opsForValue().increment(key, 1);if (failCount > MAX_DAILY_FAIL_ATTEMPTS) {redisTemplate.expire(key, COOL_DOWN_PERIOD, TimeUnit.MILLISECONDS);return false; // 需要等待冷却时间}return true;
}
3. 成功认证后的限制
为了限制用户成功认证后的重复尝试,在Redis中存储一个标志位来记录认证的状态。
代码示例
private static final String SUCCESS_AUTH_KEY_PREFIX = "real_name_auth_success:";
private static final long SUCCESS_LIMIT_DURATION = 24 * 60 * 60 * 1000; // 一天(毫秒)public boolean checkSuccessAuth(String userId) {String key = SUCCESS_AUTH_KEY_PREFIX + userId;Boolean isAuthed = redisTemplate.hasKey(key);if (isAuthed) {return false; // 已经认证过}redisTemplate.opsForValue().set(key, "true", SUCCESS_LIMIT_DURATION, TimeUnit.MILLISECONDS);return true;
}
4. 整合以上功能
整合上述功能到一个统一的方法中,以便在实名认证过程中调用。
代码示例
public boolean authenticateRealName(String userId, String name, String idNumber) {if (!checkDailyFailCount(userId)) {return false;}if (!checkCoolDownPeriod(userId)) {return false;}// 这里可以添加具体的实名验证逻辑boolean isAuthenticated = verifyRealName(name, idNumber);if (isAuthenticated) {if (!checkSuccessAuth(userId)) {return false;}// 成功认证后,可以清除失败计数器redisTemplate.delete(DAILY_FAIL_COUNT_KEY_PREFIX + userId);}return isAuthenticated;
}
结论
通过以上步骤,可以在业务层实现实名认证次数的限制,包括每日失败尝试次数的限制、失败后的冷却时间以及成功认证后的限制。这种方法简单且易于维护,适合大多数应用场景。
相关文章:
实名认证次数限制
在业务层实现实名认证次数限制 这个功能是通过以下步骤实现实名认证的次数限制: 每日失败尝试次数限制:限制用户每天可以尝试失败的次数。失败后的冷却时间:用户在连续失败几次后需要等待一段时间才能再次尝试。成功认证后的限制࿱…...
【如何在Python中使用pathlib模块】
在Python中使用pathlib模块主要涉及创建Path对象,并利用这些对象提供的方法来执行文件系统的各种操作。以下是一些详细的步骤和示例,帮助你了解如何在Python中有效地使用pathlib模块。 1. 导入Path类 首先,从pathlib模块中导入Path类。 fr…...
sqli-labs第一关详细解答
首先判断是否有注入点 发现and 11 和 and 12结果一样,所以应该是字符型注入,需要对单引号做闭合 做闭合后发现报错,提示Limit 0,1,那就说明存在注入点,但是要注释掉后面的limit 0,1 使用--注释掉limit 0,1后ÿ…...
分布式事务一站式解决方案-Seata
分布式事务一站式解决方案- 分布式事务一站式解决方案分布式事务产生背景三个概念Seata下载和安装实际业务模拟演示不加 GlobalTransactional 注解,正常操作下单不加 GlobalTransactional 注解,下单过程出异常或者超时了加 GlobalTransactional 注解&…...
openwrt 使用ftace工具追踪协议栈转发流程
开这四个宏 CONFIG_KERNEL_DYNAMIC_FTRACEy CONFIG_KERNEL_FTRACEy CONFIG_KERNEL_FUNCTION_GRAPH_TRACERy CONFIG_KERNEL_FUNCTION_TRACERy 如果/sys/kernel/debug/tracing没有,可以挂载 mount -t debugfs nodev /sys/kernel/debug 挂载报错: mo…...
ElasticSearch优化实战:打造高性能搜索引擎的秘籍
在当今这个大数据时代,信息的海量增长对搜索技术提出了前所未有的挑战。用户不仅需要快速准确地从数以亿计的数据中找到所需信息,还希望搜索引擎能够提供个性化和智能化的搜索体验。ElasticSearch作为市场上领先的搜索引擎,因其强大的全文搜索…...
【STL】| C++ 栈和队列(详解、容器适配器的初步引入)
目录 前言 总代码 容器适配器的引入 栈 stack 队列 queue 栈和队列用法简介 栈 队列 deque简介(了解即可) 结语 前言 今天我们要讲解的结构是栈和队列 这两个的具体实现相比于前面我们学的string、vector、list都要简单得多(因为容…...
xss漏洞(二,xss靶场搭建以及简单利用)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 一,环境搭建。 使用工具:PHP study,dvwa靶场。 1,GitHub上下载dvwa到PHP study的WWW文件夹内,并解压。 dvwa下载地址 …...
深度学习--------------Kaggle房价预测
目录 下载和缓存数据集访问和读取数据集总代码 数据预处理训练K折交叉验证模型选择总代码提交你的Kaggle预测提交Kaggle 下载和缓存数据集 import hashlib import os import tarfile import zipfile import requests# download传递的参数分别是数据集的名称、缓存文件夹的路径…...
cpio 命令
前言 cpio(Copy In and Out)是一种在类 Unix 操作系统中处理归档文件的多功能工具。与 tar 不同,cpio 有其独特的优势和使用场景,特别是在与其他命令结合使用时。本文将带你了解 cpio 的基础知识、用法及实际示例。 什么是 cpio…...
TreeMap自定义排序
我们都知道TreeMap可以根据key按字典升序排序。但在某些场景下,我们需要自定义排序规则,为了代码优雅一些,我们也希望在stream中groupingBy时自定义排序规则,就可以参考本文的实现。 1. 使用TreeMap默认的排序规则(按…...
我的CSDN 512天创作纪念日-20240807
机缘 在 2023 年 3 月 13 日,我撰写了第一篇技术博客《软考高级-系统分析师-案例分析-系统维护与设计模式》。那一天,我决定将自己的实战项目经验和学习心得记录下来,与更多志同道合的朋友分享。成为一名专业 IT 作者的梦想,促使我…...
微服务-实现nacos的集群和Gateway网关的实现、认证校验、解决跨域
1. nacos的集群模式 1.1 分析 nacos在企业中的使用100%都是集群模式。需要掌握nacos集群的搭建 nacos的数据存放在derby本地磁盘中,nacos集群模式会导致数据库数据不一致,使用加一层思想,修改nacos的数据库,使用mysql数据库&…...
数据库中的约束,聚合函数以及联合查询
目录 数据库中的约束 not null unique default primary key foreign key 表的设计 聚合函数(查询) 分组 联表查询(多表查询) 内连接 外连接 左外连接 右外连接 自连接 子查询 合并查询 数据库中的约束 为了保证…...
【AI大模型】Ollama+OpenWebUI+llama3本地大模型
本地部署大模型 0.引言1.部署安装1.1部署工具1.2 概念介绍1.3 ollama安装后的基本使用1.4 大模型权重下载1.4.1 ollama在线下载1.4.2 huggingFace下载大模型权重及如何使用ollama进行调用 2.带有UI界面的使用3.参考 0.引言 (1)目的 本教程主要关于开源A…...
习题20240807
文章目录 题目 1: 泛型类题目 2: 泛型方法题目 3: 泛型接口题目 4: 泛型约束题目 5: 泛型集合题目6:题目7:题目8:题目9: 题目 1: 泛型类 编写一个泛型类 Box,它能够存储一个类型为 T 的值,并提供方法 SetI…...
src挖掘-记一次有趣的逻辑漏洞分享
漏洞挖掘-记一次有趣的逻辑漏洞挖掘 前言简述1、信息收集2、找功能点3、挖掘漏洞案例一:任意用户注册漏洞案例二-垂直越权导致管理员密码重置获得管理员后台权限漏洞总结 前言 此文章是小白的学习笔记,请不要利用文章内相关知识点进行非法渗透ÿ…...
【C++】STL | list (链表)详解及重要函数的实现
目录 前言 总代码 ListNode类框架的建立 (成员与模板) list类的框架 普通构造 与 empty_init(适合不同类型构造函数的小函数) list的迭代器 引子 operator、operator--(前置与后置) operator 与 operator! operator* 与 …...
警惕智能手机的“隐形眼”:如何保护我们的数字隐私堡垒
随着智能手机深入我们生活的方方面面,它变得无所不在,甚至无所不知。 但你是否意识到,你的手机可能正在悄无声息地“监听”你的一举一动? 从你的搜索习惯到日常对话,手机的个性化推荐系统正不断收集你的数据。 本文…...
人工智能算法工程师(高级)课程12-自然语言处理之NLP的语言模型-ELMo,transformer,BERT与代码详解
大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程12-自然语言处理之NLP的语言模型-ELMo,transformer,BERT与代码详解。本课程面向高级人工智能算法工程师,深入讲解自然语言处理(NLP)中的关键语言模型技术,包括了EMLo和transformer架构。此外,课程还详细…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
