阿里面试官问我:如何设计登录接口,十分钟内连续登录5次失败,需要等待30分钟才能登录

最新阿里需求挑战-十分钟内连续登录5次失败,需要等待30分钟才能登录【附图】 前言 今天看到一个文章,‘阿里面试官问我:十分钟内连续登录5次失败,需要等待30分钟才能登录’,觉得很有意思,虽然是一个普遍需求,但是解决方案非常多,于是自己半个小时画了个图,写了几行伪代码,来解一下这个需求,毕竟天天CRUD也挺无聊的,非最佳解决方案,仅供互相讨论学习,希望各位轻喷。 直接上图 图解 登录请求 验证锁定缓存,锁定直接返回登录次数过多已锁定 未锁定 验证账号密码 验证失败 最近10分钟失败次数计数 次数>=5,设置锁定缓存,返回失败 验证成功 删除计数. 阅读详情

写在前面: 正常业务里的实现不能这样搞,合适的方法是走缓存,比如使用redis,我当时就只有原生Java API能用,请大家把这个当成算法题来看待。


  常言道:字数越短问题越大。

  今天阿里的面试官小哥哥让我实现一个登录接口,同一个用户10分钟内连续登陆5次失败,则需要等到30分钟才能登陆。

  当然大佬估计一看到这种题目会很难过,一丁点算法都没有,妙解没意思。我上来就被唬住了。登录接口?10分钟内连续5次??等待30分钟才能登陆???登陆验证????

  问号一下子就冒出来了,当然最开始我想定义一个变量firstFailTime来记录第一次失败的时间,再仔细一想不对啊,firstFailTime是动态的额,要不断变化,单一个变量不好实现啊,第一次登录失败可以记录,但如果出现前十分钟失败了4次,第11分钟又失败了一次的话,firstFailTime应该往后取第二次失败登录的时间啊,我总不能手动定义100个变量吧。。。面试官看到估计脸都绿了。恨不得给我一个Mysql数据表,把每次登陆都给存下来,这样就可以很方便的查出某个时间区间登陆的情况。

  不慌,咱们虽然不是大佬,但一点一点分析还是可以的,沉住气!等等,刚刚说到数据库存所有的登录数据??其实思考到上面已经快接近了,我不能手动创建100个变量,但我可以用一种数据结构依次记录登录失败的时间啊,突然想到LRU算法对不对!!能从数据顺序看出来时间顺序的数据结构不就是链表吗!!!还有登录验证的问题,不如偷个懒,用一个boolean控制。解决,cool~

P.S:我没考虑开多个线程去测试,因为我个人感觉用户登录不会出现在高并发的环境里,几万个人同时登陆同一个账号想想就离谱......但为了保险起见我还是给map加了synchronize关键字。


Person类:

package exam;

import java.util.LinkedList;

/**
 * Created by Enzo Cotter on 2021/3/10.
 */
public class Person {
    /**
     * 重置时间
     */
    private static final int RESET_TIME = 30;

    /**
     * 密码连续输入5次失败的持续时间
     */
    private static final int DURATION = 10;

    /**
     * 最大输入失败次数
     */
    private static final int MAX_TIMES = 5;

    /**
     * 用户id
     */
    private String id;

    /**
     * 登录失败次数
     */
    private int failCount;

    /**
     * 第一次失败的时间
     */
    private long firstFailTime;

    /**
     * 登录失败的时间
     */
    private LinkedList<Long> times;

    private boolean lock;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getFailCount() {
        return failCount;
    }

    public void setFailCount(int failCount) {
        this.failCount = failCount;
    }

    public long getFirstFailTime() {
        return firstFailTime;
    }

    public void setFirstFailTime(long firstFailTime) {
        this.firstFailTime = firstFailTime;
    }

    public LinkedList<Long> getTimes() {
        return times;
    }

    public void setTimes(LinkedList<Long> times) {
        this.times = times;
    }

    public Person() {
    }

    public Person(String id, int failCount, long firstFailTime, LinkedList<Long> times, boolean lock) {
        this.id = id;
        this.failCount = failCount;
        this.firstFailTime = firstFailTime;
        this.times = times;
        this.lock = false;
    }

    /**
     * 密码输错了进入此方法
     */
    public void isValid(){

        long thisTime = System.currentTimeMillis() / 1000;

        System.out.println("第一次登录失败时间" + thisTime);

        // 超过30分钟,重置
        if(thisTime > firstFailTime + RESET_TIME){
            this.failCount = 1;
            firstFailTime = thisTime;
            times = new LinkedList<>();
            times.addLast(thisTime);
            this.lock = false;
            return;
        }else{ // 没有超过30分钟

            if (lock){
                System.out.println("账户锁定,请" + RESET_TIME + "分钟后再来");
                return;
            }

            // 之前记录的第一次登录失败时间在10分钟之前了,要换
            while(!times.isEmpty() && thisTime > times.getFirst() + DURATION){
                times.removeFirst();
                this.failCount --;
                this.firstFailTime = times.isEmpty() ? thisTime : times.getFirst();
            }

            if(this.failCount >= 5 && thisTime < firstFailTime + DURATION){
                System.out.println("10分钟内密码错误大于等于5次,登录失败");
                times.addLast(thisTime);
                this.lock = true;
            }else if(failCount < MAX_TIMES){
                this.failCount ++;
                System.out.println("密码错误" + this.failCount + "次");
                times.addLast(thisTime);
            }
        }
    }
}
复制代码

主类:

package exam;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

/**
 * Created by Enzo Cotter on 2021/3/10.
 */
public class FlowLimit {

    private static Map<String, Person> map = new HashMap<>();

    /**
     * 登录
     * @param id
     * @param flag  是否成功
     */
    public static void login(String id, boolean flag){
        if (flag){
            // 登陆成功
            return;
        }else{
            Person p = null;
            // 登录失败
            synchronized (map) {
                p = map.get(id);
                if (p == null){
                    p = new Person(id, 0, System.currentTimeMillis() / 1000,
                            new LinkedList<>(), false);
                    map.put(id, p);
                    return;
                }
                p.isValid();
            }
        }
    }

    public static void main(String[] args) {
        for(int i = 0; i < 20; i ++){
            login("aaa", false);
        }
    }
}

阿里巴巴(阿里妈妈)面经 前言 阿里妈妈我是提前批开始面试的,第一次发简历是2月7日,然后好像石沉大海了,2月27日又发了一次,这次有回应了,开始面试。 一面 3.5 80分钟 自我介绍 项目介绍 java object方法 euqals hashcode hashmap原理,线程安全吗,如果要线程安全要用什么,concurrenthashmp怎么实现的,用的什么锁 线程和进程 内存区域,为什么有些是线程私有的 直接调r... 阅读详情

相关推荐

腾讯音乐系统测试岗笔试复盘:题型考点与备考全攻略

软件测试是保障系统稳定性的核心环节,而系统测试作为其中重要分支,注重从端到端验证功能、性能与兼容性。掌握SQL查询、Linux命令和接口测试等基础技能,是测试工程师应对复杂业务场景的前提。在实际校招中,大厂笔试越来越看重候选人的测试思维与问题定位能力,而非单纯背诵理论。以腾讯音乐系统测试岗笔试为例,其题型覆盖计算机基础、数据库、Linux、编程及测试设计,尤其强调业务场景嵌入与异常流覆盖。通过分析真实笔试题目,可以明确知识储备方向,包括多表查询、窗口函数、常用日志排查命令,以及基于功能、接口、数据一致性等多

weixin_33755649的博客 630

JAVA实现用户登录错误N次后,账户暂时锁定

本次要实现的需求是,用户登录错误,输入密码错误N次后,实现用户锁定,让用户等待一段时间后重新登录,目的是为了防止黑客暴力破解用户密码。

洛阳泰山的博客 5755

银行系测试开发笔试核心考点与备考策略

在软件测试领域,银行系测试开发岗位的笔试考察重点与互联网大厂有明显差异,更侧重基础扎实度、数据库能力与业务思维。理解这一差异,是高效备考的第一步。这类考试通常覆盖计算机基础、SQL编写、事务隔离级别、测试用例设计等核心内容,其中数据库和测试基础理论占比最高,且常结合真实金融业务场景出题。掌握SQL多表联查、聚合函数、索引原理,以及等价类划分、边界值分析等测试方法,是拿到高分的关键。同时,合理规划答题时间、熟悉银行笔试的出题风格,能显著提升通过率。本文从技术概念到实战策略,系统梳理了银行系测试开发笔试的备考路

weixin_34268169的博客 426

java实现登陆失败n次锁定账户,y分钟后自动解锁,两次失败间隔时间过大则不计次数(含redis处理)

1. 功能说明 功能使用springboot框架完成,主要就是作用就是当用户登陆错误次数过多(本文登陆3次失败,锁定账户30分钟),将锁定账户,在30分钟后自动解除,并且如果两次错误登陆时间大于指定的时间差(本文为了演示,使用1分钟来代替),就只更新错误登陆时间,不更新错误登陆次数。 登陆次数,锁定时间以及登陆错误时间间隔应该放在配置文件中,本文为了演示,暂时写在代码中,后续上线部署就需要放在配置文件中来获取 2.代码层面 (1)实体类(SysUserDO) //多余的实体属性可能不需要,已隐藏

qq_45502554的博客 9468

携程2023秋招技术笔试复盘:考察结构、编程题与备考策略

在技术类岗位的秋招笔试中,数据结构、算法、操作系统与计算机网络这些计算机基础知识点始终是考察的重心。笔试设计的目标并非追求满分,而是通过分档制筛选出基础扎实、逻辑清晰的通用型工程师。理解这一原理后,考生便能更有针对性地分配时间:行测题快速跳过、专业客观题稳扎稳打、编程题优先拿稳常规题型的分数。此类笔试常见于携程等互联网企业的技术通用岗招聘中,其题型覆盖行测、专业选择与编程题,备考时需结合真题复盘与知识查漏补缺。本文以携程2023秋招技术通用岗笔试为例,详细拆解考察结构、高频考点、时间分配与避坑清单,为求职者

weixin_34375251的博客 311

RabbitMQ 自学指南:核心模型、代码示例与高频面试题

消息队列是分布式系统中实现异步解耦、流量削峰的核心组件,RabbitMQ 作为最流行的开源消息中间件之一,基于 AMQP 协议提供了可靠、灵活的路由机制。文章从同步调用的痛点切入,解释了为什么需要消息队列,并拆解了交换机、队列、绑定等核心概念,通过 Direct、Fanout、Topic 的对比帮助读者理解路由原理。随后给出 Docker 与 Windows 环境搭建方法,并用 Python 和 C# 演示 JSON 消息的发送与接收。围绕可靠性,文章深入探讨了消息持久化、ACK 确认、死信队列、消息堆积与

weixin_33796205的博客 437

使用Java语言实现:1.模拟账号登录(限制错误次数为三次)2.打分系统(去掉一个最高分和一个最低分,取平均值)

登录账号案例与打分案例

Tmos_Vid的博客 444

SpringBoot+MyBatis-Plus快速集成避坑指南

SpringBoot与MyBatis-Plus整合是Java后端开发的基础能力,其核心在于理解自动配置原理、依赖冲突机制及运行时Bean生命周期。技术价值体现在降低单表CRUD开发成本、统一SQL审计与逻辑删除语义,并支撑高并发场景下的事务一致性。典型应用场景包括微服务用户中心、内容管理后台及IoT设备数据接入层。实践中需重点关注JDK版本兼容性、MySQL字符集配置、MyBatis-Plus主键策略(如id-type: auto)与逻辑删除(@TableLogic)的底层SQL重写机制,避免因环境差异或配

lizaochengwen的专栏 429

如何设计登录接口,十分钟内连续五次登录失败,需要等待30分钟才能继续登录

登录信息设计 isfail方法逻辑: class Person{ //重置时间--16s private static final int RESET_TIME=16; //密码连续输入3次失败的持续时间--8 private static final int DURATION=8; //最大输入失败次数3 private static final int MAX_TIMES=3; //用户id private String id;

奈斯查尔斯吴的博客 3307

基于Java的学生考勤系统设计与实现:Spring Boot+MyBatis全解析

Java后端开发中,权限管理与数据库设计是构建企业级应用的核心基础。Spring Boot作为当前主流的Java开发框架,通过自动配置与starter机制大幅简化了项目搭建;MyBatis则凭借灵活的SQL控制能力,在复杂业务报表查询中优势明显。以学生考勤系统为例,这类多角色业务系统天然适合实践RBAC权限模型,同时涵盖课表生成、签到逻辑、请假审批、统计报表等典型场景。本文从概念到原理,系统拆解考勤系统的数据表设计、核心业务实现与常见踩坑点,帮助你掌握从零构建一个可扩展、可维护的Java Web项目的完整思

390

基于Java+Spring Boot的在线考试系统设计与实现详解(含源码部署)

在Java Web开发中,数据库设计和权限控制是构建任何业务系统的核心基础。理解如何通过Spring Boot整合MyBatis与MySQL,实现用户认证、事务管理和数据持久化,是提升工程能力的关键。在线考试系统作为经典的实战项目,完整覆盖了从题库管理、随机组卷、限时答题到自动判分的业务闭环。本文从通用技术原理出发,深入解析了数据库表结构设计、登录拦截器、多种组卷策略以及后端时间控制等核心模块的实现思路,并提供了项目部署与常见问题排查的实操指南。无论你是准备毕业设计,还是希望巩固Java后端开发技能,都能借

cuiji1279的博客 420

阿里面试官问我:如何设计登录接口,十分钟内连续登录5次失败,需要等待30分钟才能登录...

点击上方“果汁简历”,选择“置顶公众号”「写在前面」:正常业务里的实现不能这样搞,合适的方法是走缓存,比如使用redis,我当时就只有原生Java API能用,请大家把这个当成算法题来看待...

weixin_37097680的博客 356

手把手教你用ROS2控制PX4无人机画个圆:从C++代码到Gazebo仿真全流程解析

本文详细解析了如何使用ROS2控制PX4无人机实现圆形轨迹飞行,涵盖从C++代码编写到Gazebo仿真的全流程。重点介绍了Offboard模式下的控制算法实现、圆形轨迹生成的数学原理,以及解决通信延迟和坐标系转换等常见问题的实用技巧。通过实战案例,帮助开发者快速掌握无人机轨迹跟踪仿真的核心技术。

weixin_30839881的博客 95

阿里面试官问我:如何设计登录接口,十分钟内连续登录5次失败,需要等待30分钟才能登录(1)

搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)一个人可以走的很快,但一群人才能走的更远!

2401_83977825的博客 817

Qt上位机实战:5步搞定STM32 IAP固件升级(附拖拽文件处理技巧)

本文详细介绍了如何使用Qt开发STM32 IAP固件升级上位机。通过五个核心步骤,包括理解IAP机制、搭建Qt环境、实现拖拽文件加载、封装串口通信以及设计可靠通信协议,帮助开发者快速构建一个稳定、易用且支持图形化操作的固件升级工具,显著提升嵌入式产品开发与维护效率。

ss78901的博客 1070

分布式存储系统关于GDPR条例中的数据清除原则

文章目录前言HDFS存储系统数据的完全删除基于加解密的输入输出流的数据保护方案 前言 关于GDPR是什么,可能许多同学之前并不太了解,至少笔者在之前也是不清楚的。GDPR全称为通用数据保护条例,General Data Protection Regulation。它是一项来自欧盟的关于计算机数据保护相关的条约,旨在规范系统如何收集,管控用户私人数据的种种行为。但是当前的一些存储系统并没有完全符合...

走在前往架构师的路上 3623

如何设计登录接口,十分钟内连续登录5次失败,需要等待30分钟才能登录

正常业务里的实现不能这样搞,合适的方法是走缓存,比如使用redis,我当时就只有原生Java API能用,请大家把这个当成算法题来看待 常言道:字数越短问题越大。   今天阿里的面试官小哥哥让我实现一个登录接口,同一个用户10分钟内连续登陆5次失败,则需要等到30分钟才能登陆。   当然大佬估计一看到这种题目会很难过,一丁点算法都没有,妙解没意思。我上来就被唬住了。登录接口?10分钟内连续5次??等待30分钟才能登陆???登陆验证????   问号一下子就冒出来了,当然最开始我想定义一个变量firstFai

qq_33240556的博客 830

使用podman 容器化安装DIFY

本文阐述了使用podman容器化安装DIFY的过程

wengad的博客 1901

2025字节后端面试高频考点解析:从并发原理到系统设计

后端开发中,并发编程、JVM调优、数据库索引与缓存策略是决定系统性能和稳定性的核心技术。在互联网大厂的技术面试中,考察重点已从零散的知识点背诵转向对完整思考链路与工程实践能力的验证。本文结合字节跳动后端岗位的面试流程与真实追问案例,系统梳理Java内存模型、线程池、OOM排查、MySQL事务与索引、Redis缓存一致性、分布式事务、消息队列可靠性等核心专题,并拆解短链系统、秒杀系统等经典设计题。无论你是准备面试还是构建高并发业务,这些原理与应用场景都值得深入理解。文中高频考点和应答框架,恰好对应2025年字

weixin_34332905的博客 346

QEMU pcie config空间访问机制

而pci_host_conf/data_le_ops的定义是在hw/pci/pci-host.c里,对于0xCF8端口的处理,因为是地址选通,所以只需要在write的时候记录、read的时候返回记录的值即可。而pci_host_config_write/read_common接口,在前256Bconfig空间的模拟中,也同样是会调用这个接口,所以后续的处理都是一样的。这是真实的硬件设计,而对于QEMU+KVM的虚机场景,显然是要基于硬件实现和虚拟化的需求设计虚机访问config空间的完整流程。

leiyanjie8995的博客 1949

【华为OD机试真题 2025C卷】895、贪心歌手 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

【华为OD机试真题 2025C卷】895、贪心歌手 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华

KJ.JK 961

2024淘天集团数据岗秋招笔试全解析:SQL、算法与业务题备考指南

在数据驱动业务的背景下,数据岗笔试已成为衡量候选人工程能力与业务思维的重要关卡。本文从数据开发、数据分析与数据科学等岗位的通用能力要求出发,系统拆解大厂数据岗笔试的核心考察模块:SQL编程、算法编码、概率统计与业务场景分析。重点讲解了窗口函数在留存率、复购率计算中的典型应用,算法题的边界处理与复杂度优化,以及业务题中指标异动归因的三步分析法。结合2024年阿里巴巴淘天集团数据岗秋招笔试的实际题型与备考节奏,帮助应届生与转行者在短时间内建立完整的笔试应对框架,提升从取数到建模的综合实战能力。

weixin_34345753的博客 373

计算数列位置N的值

本文介绍了一个数列生成问题,要求根据输入的两个整数M和N生成特定规则的数列,并输出第N个位置上的数值。数列生成规则为:前M个元素为1到M;后续元素根据前M个元素是否重复来决定计算方式(求和或求差)。文章提供了C++、Java和Python三种语言的实现方案,均包含输入处理、数列初始化、循环计算和结果输出等步骤。各语言实现中均使用集合去重特性判断重复元素,并通过内置函数或自定义方法求取最大值和最小值。该问题主要考察基础编程能力,包括数组/列表操作、最值计算和重复元素判断等基本编程技巧。

面试高手的博客 649

淘天工程岗秋招笔试复盘:题型分布、高频考点与编程题解法

在线笔试是技术招聘中常见的筛选环节,尤其是大厂秋招,往往通过选择题与编程题综合考察候选人的基础功底和算法思维。其原理在于:选择题检验计算机网络、操作系统、数据库等核心知识的广度,编程题则考察数据结构与动态规划等算法能力的应用。掌握这些考点的内在逻辑,不仅能提升笔试通过率,也能为后续面试打下扎实基础。在阿里淘天集团工程岗的秋招笔试中,题型分布、高频考点与实战复盘成为备考关键。本文基于亲身经历,梳理从牛客笔试环境到编程题解法的全过程,并给出可复用的错题整理与面试衔接方法,帮助后续投递者更有针对性地准备。

weixin_34186128的博客 359

Plant Simulation智能行车/天车/起重机建模(1)-基本对象说明

摘要: MultiPortalCrane(多门式起重机)是一种灵活物料搬运设备,适用于造船、钢铁等行业,支持零件预组装、钢板/钢卷智能料场管理及设备装卸。其特点包括: 多门架协同:支持同轨道多门架运行,内置防撞检测; 模块化控制:可独立调节门架、小车及吊钩的速度、加速度和悬臂长度; 多样化搬运:通过目标位置设置或连接器实现零件运输; 故障与统计:可配置MTTR和可用率,实时监控各部件状态。 通过对话框可自定义轨道尺寸、门架数量及运动参数,并支持编程调用(如getPortals方法)。适用于需高精度定位和协同

qq_31964455的博客 312

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 细思极恐,Github榜首的Java面试题库,被各大厂要求直接下架
下一篇: MySQL模糊查询再也不用like+%了
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值