用户输入密码错误三次冻结账号5分钟,Java,redis
时间: 2024-12-17 13:47:57 浏览: 6
在Java应用中,当用户连续输入密码错误达到三次时,通常会将用户的账户锁定一段时间以防止恶意尝试。这里可以借助Redis这种内存数据库来存储用户的登录状态和锁定信息。Redis提供了快速的数据存取速度,非常适合做这样的实时操作。
下面是一个简单的示例流程:
1. **存储用户信息**:使用Redis的哈希表(Hash)结构,其中包含用户的ID作为键,值可以是一个字典,包含最后一次登录失败的时间戳和尝试次数。
```java
String userId = "user1";
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("lastFailed", System.currentTimeMillis());
userInfo.put("attempts", 0);
// 存储到Redis
String redisKey = "users:" + userId;
String jsonUserInfo = JsonUtils.objectToJson(userInfo); // 将Map转成JSON字符串
Jedis jedis = JedisPool.getResource();
jedis.hset(redisKey, "", jsonUserInfo);
```
2. **验证密码**:当用户输入密码时,检查是否错误,并更新尝试次数。
```java
try {
String inputPassword = getUserInput(); // 获取用户输入的密码
Map<String, Object> storedInfo = RedisUtil.getFromRedis(redisKey); // 从Redis获取用户信息
Long lastFailedTs = (Long) storedInfo.get("lastFailed");
int attempts = (int) storedInfo.get("attempts");
if (comparePasswords(inputPassword, storedInfo)) { // 如果密码正确
// 更新最后尝试时间并设置尝试次数为0
storedInfo.put("lastFailed", System.currentTimeMillis());
storedInfo.put("attempts", 0);
RedisUtil.setIntoRedis(redisKey, jsonUserInfo); // 更新Redis
} else {
if (attempts >= 3) {
long lockTime = 5 * 60 * 1000; // 锁定5分钟
Date lockUntil = new Date(System.currentTimeMillis() + lockTime);
storedInfo.put("lockUntil", lockUntil.getTime()); // 添加锁定时间
RedisUtil.setIntoRedis(redisKey, jsonUserInfo);
} else {
storedInfo.put("attempts", attempts + 1);
RedisUtil.setIntoRedis(redisKey, jsonUserInfo);
}
}
} finally {
JedisPool.returnResource(jedis);
}
```
3. **解冻机制**:在锁定期限内,每次用户请求登录时,先检查是否过期。
```java
String lockedUntil = RedisUtil.getFromRedis(redisKey).get("lockUntil");
if (lockedUntil != null && lockedUntil > System.currentTimeMillis()) {
throw new AccountFrozenException("Account is frozen for 5 minutes.");
}
```
阅读全文