常见项目场景题2(多次输错密码禁止登录,分布式下多线程抢夺资源)

devtools/2025/1/19 15:03:42/

多次输错密码后如何禁止一定时间内用户再次登录

通常使用 IP 地址为单位来进行限制,而非具体的用户。这样可以减少误伤其他用户的可能性。
(一个非法用户可能会拿他人的账号不断尝试登录)
同时,以 IP 地址为单位进行限制还可以避免黑客通过使用同-IP 地址进行暴力破解等攻击行为。提高系统的安全性和稳定性。
使用 Redis解决该问题
使用 Redis 记录当前 ip 的尝试登录次数:
·key 为该 ip 请求登录的唯一标识
·value 为当前 ip 的尝试登录次数
需要给 key 设置一个过期时间,用来实现指定时间内无法再次登录的效果。并且,每次
对 key 对应的 value 进行修改时,都需要重置过期时间。
大致运行流程如下:

  1. 当用户登录时,判断是否有对应的 key
  2. 如果没有对应 key ,说明是第一次登录,如果密码出错,就创建对应的 key,key 对应的 value 值为设为1
  3. 如果有对应的 key,说明不是第一次登录了,需要判断 key 对应的 vaue 大小是否小于 3。
  4. 如果小于3则代表还能继续尝试登录,重复密码校验这一步。如果密码继续出错,就返回“登录失败”,并将 key 对应的 value值加1
  5. 如果 value 等于 3,返回“输入密码错误次数达到 3次,请 xx 分钟后再尝试”

多线程抢夺共享资源情景(多位用户抢一个红包,如何保证只有一个抢到?)

为了共享资源被安全地访问,需要对共享资源进行加锁
实际生产项目多为分布式环境,分布式系统下,不同的服务/客户端通常运行在独立的 JVM 进程上。如果多个 JVM 进程共享同一份资源的话,使用本地锁就没办法实现资源的互斥访问了。于是,分布式锁 就诞生了。
分布式锁常用Redis实现
什么是分布式缓存

如何基于 Redis 实现一个最简易的分布式锁?

在 Redis 中, SETNX 命令是可以帮助我们实现互斥。SETNXSET if Not eXists,如果 key 不存在的话,才会设置 key 的值

> SETNX lockKey uniqueValue
(integer) 1
> SETNX lockKey uniqueValue
(integer) 0

释放锁的话,通过 DEL 命令删除对应的 key 即可。

> DEL lockKey
(integer) 1

为了防止误删其他的锁,这里我们建议使用 Lua 脚本通过 key 对应的 value(唯一值)来判断。
选用 Lua 脚本是为了保证解锁操作的原子性。因为 Redis 在执行 Lua 脚本时,可以以原子性的方式执行,从而保证锁释放操作的原子性

java">// 释放锁时,先比较锁对应的 value 值是否相等,避免锁的误释放
if redis.call("get",KEYS[1]) == ARGV[1] thenreturn redis.call("del",KEYS[1])
elsereturn 0
end

http://www.ppmy.cn/devtools/115318.html

相关文章

【STM32】STM32G431RBT6芯片引脚默认功能是什么?

1. PA9、PA10 STM32G431RBT6芯片的PA9和PA10引脚具有串口通信功能,其中PA9用作发送(TX),PA10用作接收(RX)。 在STM32G431RBT6中,GPIO端口A(PA0~PA15)是多功能的输入输出…

uni-app安装插件

1.通过插件市场安装https://ext.dcloud.net.cn 打开HBuilderX编辑器。 点击菜单栏中的“工具”->“插件安装”。 这里会看到已安装插件和安装新插件两个选项卡,点击安装新插件, 能看到一些核心插件,如果所需要的插件在核心插件里面有&…

一般在写SQL时需要注意哪些问题,可以提高查询的效率?

很多人写SQL按照自己喜好,没有规则意识,这对于自主查询影响不大,你爱怎么搞就怎么搞,一旦涉及到提交任务或团队共享,就不能乱写了,会浪费资源影响到开发效率,严重的甚至会服务器瘫痪。 提几个关…

【大屏方案】可视化综合展示系统解决方案(Word原件2024)

2.系统架构设计 2.1.系统架构图 2.2.关键技术 2.3.接口及要求 3.系统功能设计 3.1.功能清单列表 3.2.数据源管理 3.3.数据集管理 3.4.视图管理 3.5.仪表盘管理 3.6.移动端设计 3.1.系统权限设计 3.2.数据查询过程设计 软件资料清单列表部分文档清单:工作安排任务书&…

Python数据分析与可视化基础教程

Python数据分析与可视化基础教程 一、引言 Python是一种功能强大的编程语言,广泛应用于数据科学、机器学习、Web开发等领域。在数据分析与可视化方面,Python提供了丰富的库和工具,可以帮助我们轻松地处理数据、提取有用信息,并将…

CefSharp_Vue交互(Element UI)_WinFormWeb应用---设置应用透明度(含示例代码)

一、界面预览 1.1 设置透明(整个页面透明80%示例) 限制输入值:10-100(数字太小会不好看见) 1.2 vue标题栏 //注册类与js调用 (async function(

xray 与 nginx 多网站共存(443端口复用方案)

xray 与 nginx 多网站共存(443端口复用方案) 443 端口只能一个程序进行监听,所以方案有两个,一个是用 nginx 的负载均衡分流给 xray,另一个是使用 xray 的回落功能分流给 nginx 当然把其中一个修改为非 443 端口也行,但这样既不…

Spring:项目中的统一异常处理和自定义异常

介绍异常的处理方式。在项目中,都会进行自定义异常,并且都是需要配合统一结果返回进行使用。 1.背景引入 (1)背景介绍 为什么要处理异常?如果不处理项目中的异常信息,前端访问我们后端就是显示访问失败的…