登录验证登录次数失败过多进行设置延时

现象结果示例截图

swagger示例效果

在这里插入图片描述

控制台示例效果

在这里插入图片描述

后端代码示例

package com.java.javamethod.service.impl;import com.java.javamethod.dao.UserMapper;
import com.java.javamethod.domain.Result;
import com.java.javamethod.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;/*** @Author ww* @Date 2024/4/29 15:53* @Version 1.0*/
@Service("loginService")
@Slf4j
public class LoginServiceImpl implements LoginService {@Resourceprivate UserMapper userMapper;@Resourceprivate RedisTemplate<String, Integer> redisTemplate;private static final String FAIL_COUNTER = "user_login_fail_counter";private static final String FAIL_LOCK = "user_login_fail_lock";/*** 登录失败计数器** @param username*/public void setCheckFailCounter(String username) {String key = String.join(":", FAIL_COUNTER, username);Integer count = redisTemplate.opsForValue().get(key);redisTemplate.opsForValue().increment(key);if (count == null) {//第一次操作设置过期时间,在没有达到5次之后,十分钟重新计时计算,只计算当前十分钟之内的登录次数redisTemplate.expire(key, 10, TimeUnit.MINUTES);}if (count!=null&&count.intValue() > 5) {// 失败达到五次 设置锁定缓存lock(username);}}/*** 移除计数器** @param username*/public void deleteLoginFailCounter(String username) {redisTemplate.delete(String.join(":", FAIL_COUNTER, username));}/*** 失败达到一定一定次数 锁定30分钟** @param username*/public void lock(String username) {String key = String.join(":", FAIL_LOCK, username);redisTemplate.opsForValue().set(key, 1, 30, TimeUnit.MINUTES);}/*** 是否被登录锁定** @param username* @return*/public boolean isLock(String username) {return redisTemplate.hasKey(String.join(":", FAIL_LOCK, username));}/*** 获取解锁的时间** @param username* @return*/public long unlockTime(String username) {String key = String.join(":", FAIL_LOCK, username);return redisTemplate.opsForValue().getOperations().getExpire(key, TimeUnit.MINUTES);}/*** 验证登录** @param username* @param password* @return*/public Result loginCheck(String username, String password) {User user = userMapper.queryByName(username);Integer passwordStr = redisTemplate.opsForValue().get(username);if (password.equals(passwordStr)) {return Result.success();} else {if (user != null) {if (user.getPassword().equals(password)) {redisTemplate.opsForValue().set(username, Integer.valueOf(password));return Result.success().setErrmsg("用户名密码正确登录成功");} else {log.error("===========用户名密码对应错误{}==========", "密码错误");return Result.failed();}} else {log.error("========用户名密码对应错误{}=========", "用户名错误");return Result.failed();}}}@Overridepublic Result login(String username, String password) {// 1.验证用户是否被登录锁定boolean lock = isLock(username);if (lock) {// 获取过期时间long outtime = unlockTime(username);return new Result().setSuccess(false).setErrmsg("账号已经被锁定,请于"+outtime+"分钟后解锁");}Result result = loginCheck(username, password);if (!result.isSuccess()) {setCheckFailCounter(username);return new Result();}// 登录成功 移除失败计数器deleteLoginFailCounter(username);return new Result();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《绝地潜兵2》开发商目标成为下一个暴雪或FS社

《绝地潜兵2》的开发商Arrowhead正以惊人的表现在游戏界崭露头角。这款游戏在发售后迅速获得了巨大成功&#xff0c;使得Arrowhead的首席创意官Johan Pilestedt怀揣雄心壮志&#xff0c;他们的目标是在保持独立的同时&#xff0c;成为下一个暴雪或From Software。 Johan Pilest…

firewalld

一、Firewalld概述 Firewalld 支持网络区域所定义的网络链接以及接口安全等级的动态防火墙管理工具 支持IPV4、IPV6防火墙设置以及以太网桥 支持服务或应用程序直接添加防火墙规则接口 拥有两种配置模式 运行时配置 永久配置 二、Firewalld和iptables的关系 netfilter 位于L…

java中的抽象类到底如何用

抽象类的使用 一、设计模式中的使用1. 模板方法模式2. 抽象工厂模式 二、扩展性和灵活性三、为什么开发时抽象类用的很少&#xff0c;反而用接口的很多 一、设计模式中的使用 1. 模板方法模式 1.定义&#xff1a;当你需要为一组相关类提供一个操作的框架&#xff0c;其中一些…

【Muduo】三大核心之EventLoop

Muduo网络库的EventLoop模块是网络编程框架中的核心组件&#xff0c;负责事件循环的驱动和管理。以下是对EventLoop模块的详细介绍&#xff1a; 作用与功能&#xff1a; EventLoop是网络服务器中负责循环的重要模块&#xff0c;它持续地监听、获取和处理各种事件&#xff0c;…

10个最佳Android数据恢复工具,用于恢复已删除的文件

由于我们现在在智能手机上存储了许多重要文件&#xff0c;因此了解数据恢复工具变得很重要。您永远不会知道何时需要使用适用于Android的数据恢复工具。 由于不乏Windows数据恢复工具&#xff0c;因此从崩溃的计算机中恢复文件很容易。但是&#xff0c;当涉及到从Android恢复数…

兆原数通基于Apache SeaTunnel的探索实践

随着大数据技术的不断发展&#xff0c;数据同步工具在企业中的应用变得愈发重要。为了满足复杂多样的业务需求&#xff0c;找到一款高效、灵活的数据同步工具变得尤为关键。 在这篇文章中&#xff0c;我们将分享兆原数通研发经理李洪军对Apache SeaTunnel的选择、应用及经验。这…

jinkens打包前端依赖下载失败怎么办

不知道有没有小伙伴遇见这种问题&#xff0c;项目在本地可以正常下载、运行打包&#xff0c;但在jinkens上就不行了&#xff0c;配置了几种镜像也还是不行&#xff0c;这要如何解决呢&#xff1f; 那就只能去到jinkens配置的工作空间那里&#xff0c;找到对应的项目 &#xff…

Django使用Celery实现异步和定时任务功能

1、装库 celery==4.4.2 django-celery-beat==2.2.0 django-celery-results==2.0.12、添加应用 安装完依赖之后,把上面的两个应用添加到Django配置文件settings.py的INSTALLED_APPS里面: 添加celery配置信息 在项目的配置文件中添加如下配置信息,具体的配置作用见注释 I…

YOLOv5/v7 应用轻量级通用上采样算子CARAFE

1. 介绍 CARAFE&#xff08;Content-Aware ReAssembly of FEatures&#xff09;是一种轻量级的通用上采样算子&#xff0c;它可以用于提高卷积神经网络&#xff08;CNN&#xff09;中特征图的分辨率。CARAFE 的特点是计算量小、参数少、易于实现&#xff0c;因此非常适合用于移…

开放重定向漏洞

开放重定向漏洞 1.开放重定向漏洞概述2.攻击场景&#xff1a;开放重定向上传 svg 文件3.常见的注入参数 1.开放重定向漏洞概述 开放重定向漏洞&#xff08;Open Redirect&#xff09;是指Web应用程序接受用户提供的输入&#xff08;通常是URL参数&#xff09;&#xff0c;并将…

代码随想录算法训练营第四十五天|139.单词拆分

139.单词拆分 这题首先肯定是排序问题而不是组合问题&#xff0c;因为单词的顺序是一定的&#xff0c;所以组成单词的字符串顺序也是一定的。所以应该先循环背包容量&#xff0c;再循环物品个数。 背包容量就是s字符串&#xff0c;物品就是数组中的单词&#xff0c;字符串的循…

Kubernetes 文档 / 概念 / 工作负载 / Pod / Init 容器

Kubernetes 文档 / 概念 / 工作负载 / Pod / Init 容器 此文档从 Kubernetes 官网摘录 中文地址 英文地址 本页提供了 Init 容器的概览。Init 容器是一种特殊容器&#xff0c;在 Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。…

总结优秀的prompt案例,学习更有效的prompt提示词工程写法,值得收藏

Prompt 提示词工程大多数人都在用&#xff0c;而且都会用&#xff0c;但是不一定写的好&#xff1f;很多人都在想怎么写好&#xff0c;更能满足自己的业务需求&#xff0c;或者实际场景。 我最近工作中也写了很多的prompt&#xff0c;像zero-shot、few-shot、COT这些都尝试过、…

FSC认证是什么?森林认证的好处是什么?

FSC认证&#xff08;Forest Stewardship Council&#xff0c;森林管理委员会认证&#xff09;是一种运用市场机制来促进森林可持续经营&#xff0c;实现生态、社会和经济目标的工具。以下是关于FSC认证的详细介绍&#xff1a; 一、FSC认证包括两个方面&#xff1a; 森林经营认…

乡村振兴与农业现代化:以现代农业科技为引领,提升农业综合生产能力,打造高产高效、生态安全的美丽乡村

目录 一、引言 二、现代农业科技在乡村振兴中的作用 &#xff08;一&#xff09;提高农业生产效率 &#xff08;二&#xff09;促进农业产业升级 &#xff08;三&#xff09;改善农村生态环境 三、提升农业综合生产能力的途径 &#xff08;一&#xff09;加强农业科技研…

spring中依赖注入(DI)是什么?

好的&#xff0c;让我以尽可能通俗易懂的方式来解释什么是依赖注入&#xff08;DI&#xff0c;Dependency Injection&#xff09;。 假设你正在制作一款游戏&#xff0c;游戏中有个角色需要使用武器。在没有依赖注入的情况下&#xff0c;这个角色可能需要自己创建一个武器。这…

计算理论基础:4、复杂性理论

复杂性理论 c e n t e r p r o b l e m : P ≠ N P center\ \ problem:P \ne NP center problem:PNP 1.P、EXP、NP 定义1 D T I M E DTIME DTIME ​ T : N → N T:\N\rightarrow \N T:N→N,语言 L ∈ D T I M E ( T ( n ) ) L\in DTIME(T(n)) L∈DTIME(T(n)),当且仅当存…

Diffusion Policy:基于扩散模型的机器人动作生成策略

项目地址&#xff1a; Diffusion Policy (columbia.edu) 一、摘要 本文介绍了 "扩散策略"&#xff0c;这是一种生成机器人行为的新方法&#xff0c;它将机器人的视觉运动策略&#xff08;visuomotor policy&#xff09;表示为条件去噪扩散过程&#xff08;conditi…

添加、修改和删除列表元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 添加、修改和删除列表元素也称为更新列表。在实际开发时&#xff0c;经常需要对列表进行更新。下面我们介绍如何实现列表元素的添加、修改和删除。 …

TypeScript进阶 类型演算与高级内置类型

简介&#xff1a; TypeScript 是一种静态类型检查的 JavaScript 超集&#xff0c;它通过类型注解和类型推断来提供更强大的类型系统。在 TypeScript 中&#xff0c;类型演算是一种重要的概念&#xff0c;它允许我们在编译时对类型进行操作和计算。本文将深入探讨 TypeScript 类…