需要脚本演示、定制部署或海外获客方案?访问 Facebook18 官网
首页 / 文章

谷歌登录次数过多无法登录且收不到验证码(谷歌登录次数过多怎么办)

2023-03-07文章静态 HTML 文章

关于谷歌登录次数过多无法登录且收不到验证码(,资料不少但靠谱的不多。本文按真实操作顺序整理,看完就能照着做。

直接上图图解登录请求验证锁定换粗,锁定直接返回登录次数过多已锁定未锁定 验证账号密码验证失败 失败次数计数 次数=5,设置锁定缓存,返回失败验证成功 删除计数缓存,返回成功代码实现

package com.demo.service;import com.google.common.collect.Lists;import org.apache.commons.lang3.time.FastDateFormat;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Service;import java.util.Calendar;import java.util.List;import java.util.Objects;import java.util.concurrent.TimeUnit;@Servicepublic class LoginService { @Autowired private 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 * @param password * @return */ public String login { // 1.验证用户是否被登录锁定 boolean lock = isLock; if { // 获取过期时间 long t = unlockTime; return "登录验证失败次数过多,请" + t + "分钟后再试!"; } boolean check = loginCheck; if { setCheckFailCounter; return "登录失败!"; } // 登录成功 移除失败计数器 deleteLoginFailCounter; return "登录成功"; } /** * 登录失败计数器 * 缓存key user_login_fail_counter:username:yyyyMMddHHmm * * @param username */ public void setCheckFailCounter { Calendar cal = Calendar.getInstance; FastDateFormat fastDateFormat = FastDateFormat.getInstance; String minute = fastDateFormat.format; String key = String.join; Integer count = redisTemplate.opsForValue.get; redisTemplate.opsForValue.increment; if { redisTemplate.expire; } // 往前检查10分钟 统计失败次数 List<String> tenMinuteKeys = Lists.newArrayList; for { tenMinuteKeys.add)); cal.add; } List<Integer> countList = redisTemplate.opsForValue.multiGet; int total = countList.stream.filter.mapToInt.sum; if { lock; } } /** * 移除计数器 * * @param username */ public void deleteLoginFailCounter { redisTemplate.delete); } /** * 失败达到一定一定次数 锁定30分钟 * * @param username */ public void lock { String key = String.join; redisTemplate.opsForValue.set; } /** * 是否被登录锁定 * * @param username * @return */ public boolean isLock { return redisTemplate.hasKey); } /** * 获取解锁的时间 * * @param username * @return */ public long unlockTime { String key = String.join; return redisTemplate.opsForValue.getOperations.getExpire; } /** * 验证登录 * * @param username * @param password * @return */ public boolean loginCheck { // 验证账号密码是否正确 省略... return false; }}复制代码

失败计数器弟一版本代码

public void setCheckFailCounter { String key = String.join; Integer count = redisTemplate.opsForValue.get; redisTemplate.opsForValue.increment; if { // 弟一次操作设置过期时间 redisTemplate.expire; } if == 5) { // 失败达到五次 设置锁定缓存 lock; }}复制代码

弟一版本计数器的问题

时间滑动性的问题,比如10分钟内只失败了4次 然后又可以进行请求了,又来了一次验证失败的请求,这个请求与前面的后三次失败也在10分钟内,但是这时候失败总次数只是1,其实相对于蕞新的一次登录失败,十分钟内的失败次数也是4

新版本的解决思路

每分钟的操作失败进行单独的统计,每次用系统时间向前检查10分钟总共失败次数,大于5就进行锁定,做到了,解决了弟一版本的问题,新版本的代码已经在上面更新了

总结

核心点在于每次都是蕞近10分钟的总失败次数,而不是失败了一次开始10分钟过期做自增,这也是自己再初版代码出现的问题,已经解决了

查看演示与获取方案

读完本篇后,可通过下方入口查看演示视频、联系客服或访问主站。