首页 > 编程语言 >视频直播app源码,利用缓存实现连续登录失败后的时间等待

视频直播app源码,利用缓存实现连续登录失败后的时间等待

时间:2024-01-20 14:22:58浏览次数:22  
标签:username 缓存 String 登录 app 源码 失败 key redisTemplate

实现步骤:

1、用户在视频直播app源码中发起登录请求

2、后台验证是否失败次数过多,账户没有锁定的话就进入下面的步骤;否则直接返回

3、验证用户的账号 + 密码

3.1 验证成功:删除缓存
3.2 验证失败:统计最近10分钟时间窗口内的失败次数,如果达到5次则设置锁定缓存,返回

图解实现步骤:

在这里插入图片描述
代码实现细节:

登录失败计数器的key设计为:一串字符串 + 用户名(假设具有唯一性)+ 登录失败的时间

锁定登录操作的key设计为:一串字符串 + 用户名(假设具有唯一性)

private static final String FAIL_COUNT_REDIS_KEY = "login_fail_count";

private static final String LOCK_REDIS_KEY = "login_lock";

private static final String SEPARATOR = ":";

 

用户登录服务:

@Override
public String login(String username, String password) {
    // 验证用户是否被登录锁定
    boolean lock = isForbidden(username);
    if (lock) {
        return "Login authentication failed too many times. Please try again after " + unLockTime(username) + " minutes.";
    }
    // 验证用户名 + 密码
    boolean isLogin = userRepository.checkUsernameAndPassword(username, password);
    if (!isLogin) {
        // 登录失败
        setFailCounter(username);
        return "login fail";
    }
    // 登录成功 移除失败计数器
    deleteFilCounter(username);
    return "login success";
}

 

登陆失败的话,就给登录失败次数加一:

@Override
public void setFailCounter(String username) {
    // 获取当前时间
    Calendar cal = Calendar.getInstance();
    String minute = fastDateFormat.format(cal);

    // 登录失败次数 + 1
    String key = String.join(SEPARATOR, FAIL_COUNT_REDIS_KEY, username, minute);
    Integer count = redisTemplate.opsForValue().get(key);
    redisTemplate.opsForValue().increment(key, 1); // 如果key不存在的话就会以增量形式存储进来

    if (count == null) {
        redisTemplate.expire(key, 10, TimeUnit.MINUTES);
    } 

    // 如果失败次数大于5次,锁定账户
    List<String> windowsKeys = new ArrayList<>();
    for (int i = 0; i < 10; i ++) {
        windowsKeys.add(String.join(SEPARATOR, FAIL_COUNT_REDIS_KEY, username, fastDateFormat.format(cal)));
        cal.add(Calendar.MINUTE, -1);
    }
    List<Integer> countList = redisTemplate.opsForValue().multiGet(windowsKeys);

    assert countList != null;

    int total = 0;
    for (Integer c : countList) {
        total += c;
    }
    if (total >= maxFailTimes) {
        forbidden(username);
    }
}

 

如果登录成功,则删除失败次数计数器:

@Override
public void deleteFilCounter(String username) {
    Calendar cal = Calendar.getInstance();
    List<String> windowKeys = new ArrayList<>();
    for (int i = 0; i < 10; i ++) {
        windowKeys.add(String.join(SEPARATOR, FAIL_COUNT_REDIS_KEY, username, fastDateFormat.format(cal)));
        cal.add(Calendar.MINUTE, -1);
    }
    redisTemplate.delete(windowKeys);
}

 

失败次数超过5次则禁止登录,只需要设置一个缓存即可:

@Override
public void forbidden(String username) {
    String key = String.join(SEPARATOR, FAIL_COUNT_REDIS_KEY, username);
    redisTemplate.opsForValue().set(key, 1, 30, TimeUnit.MINUTES);
}

 

判断是否被禁止登录,只需要判断是否有上面方法设置的key即可:

@Override
public boolean isForbidden(String username) {
    try{
        return Boolean.TRUE.equals(redisTemplate.hasKey(String.join(SEPARATOR, FAIL_COUNT_REDIS_KEY, username)));
    }catch (Exception e){
        e.printStackTrace();
    }
    return false;
}

 

如果想要获取到用户具体需要几分钟才能解锁(用于提示信息),只需要查询缓存的过期时间:

private Long unLockTime(String username){
    String key = String.join(SEPARATOR, LOCK_REDIS_KEY, username);
    Long expireTime = redisTemplate.opsForValue().getOperations().getExpire(key, TimeUnit.MINUTES);
    if (expireTime == null){
        throw new RuntimeException("there is no unlock time");
    }
    return expireTime;
}

 

以上就是视频直播app源码,利用缓存实现连续登录失败后的

 

标签:username,缓存,String,登录,app,源码,失败,key,redisTemplate
From: https://www.cnblogs.com/yunbaomengnan/p/17976431

相关文章

  • MetaGPT day02: MetaGPT Role源码分析
    MetaGPT源码分析思维导图MetaGPT版本为v0.4.0,如下是frommetagpt.rolesimportRole,Role类执行Role.run时的思维导图:概述其中最重要的部分是_react,里面包含了一个循环,在循环中交替执行_think和_act,也就是让llm先思考再行动。_think中决定了llm下一个执行的动作是什么,这个动作......
  • TCP三次握手源码分析(服务端接收ACK&TCP连接建立完成)
    内核版本:Linux3.10内核源码地址:https://elixir.bootlin.com/linux/v3.10/source(包含各个版本内核源码,且网页可全局搜索函数)《TCP三次握手源码分析(客户端发送SYN)》《TCP三次握手源码分析(服务端接收SYN以及发送SYN+ACK)》《TCP三次握手源码分析(客户端接收SYN+ACK以及发送ACK......
  • 《Java并发实现原理:JDK源码剖析》PDF
    《Java并发实现原理:JDK源码剖析》全面而系统地剖析了JavaConcurrent包中的每一个部分,对并发的实现原理进行了深刻的探讨。全书分为8章,第1章从最基础的多线程知识讲起,理清多线程中容易误解的知识点,探究背后的原理,包括内存重排序、happen-before、内存屏障等;第2~8章,从简单到复杂,逐......
  • 《Java并发实现原理:JDK源码剖析》PDF
    《Java并发实现原理:JDK源码剖析》全面而系统地剖析了JavaConcurrent包中的每一个部分,对并发的实现原理进行了深刻的探讨。全书分为8章,第1章从最基础的多线程知识讲起,理清多线程中容易误解的知识点,探究背后的原理,包括内存重排序、happen-before、内存屏障等;第2~8章,从简单到复杂,逐......
  • 记一次缓存失效引发的惨案!
    对于小猫来讲,最近的一段日子是不好过的,纵使听着再有节拍的音乐,也换不起他对生活的热情。由于上一次“幂等事件”躺枪,他已经有几天没有休息好了。他感觉人生到了低谷。当接手这个商城项目之后,他感觉他一直没有好过。他的内心彷徨,在工位上边写着事故报告,边嘀咕着“今年到底是犯了啥......
  • 图像采集和多缓存项目中的若干总结
    遇到的问题:1.图像滚动:原因:没有读出/写入整幅图像导致;2.图像错位:原因:在读出当前帧前,已向fifo里写入了若干数据;(合理的设置hdmi的启动可以解决这个问题);3.图像撕裂:原因:读到了写入区域;缓存多帧数可以解决这个问题;4.缓存后的图像闪动:原因:没有准确的设置启动,导致不合理的地址跳跃;5.6......
  • A021 《斗图大赛》编程 源码
    一、课程介绍本节课将学习新的while循环,并结合布尔值True实现无限循环,最终实现一个动态表情包的效果。二、重难点解析布尔值在编程中,True是真,False是假。“真,假”,也是“对,错”的意思,它们是由英国著名数学家和逻辑学家乔治布尔提出的。所以,True和False也叫做布尔值,用于表示......
  • Applescript实现无痕检测手机号或邮箱号是否注册iMessage服务,iMessage蓝号检测完美实
    一、检测数据的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2.编写脚本控制Macos/ipho......
  • 手写 Mybatis-plus 基础架构(工厂模式+ Jdk 动态代理统一生成代理 Mapper)
    这里写目录标题前言温馨提示手把手带你解析@MapperScan源码手把手带你解析@MapperScan源码细节剖析工厂模式+Jdk代理手撕脚手架,复刻BeanDefinitionRegistryPostProcessor手撕FactoryBean代理Mapper在Spring源码中的生成流程手撕MapperProxyFactory手撕增强逻辑Invoca......
  • 纯网页语音视频聊天和桌面分享(附源码,PC版+手机版)
    在网页里实现文字聊天是比较容易的,但若要实现视频聊天,就比较麻烦了。本文将实现一个纯网页版的视频聊天和桌面分享的Demo,可直接在浏览器中运行,不需要安装任何插件。一.主要功能及支持平台1.本Demo的主要功能有(1)一对一语音视频聊天。(2)远程桌面观看。(3)当客户端掉线时,会......