现象结果示例截图
swagger示例效果

控制台示例效果

后端代码示例
package com.java.javamethod.service.impl;
import com.java.javamethod.dao.UserMapper;
import com.java.javamethod.domain.Result;
import com.java.javamethod.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@Service("loginService")
@Slf4j
public class LoginServiceImpl implements LoginService {
@Resource
private UserMapper userMapper;
@Resource
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";
public void setCheckFailCounter(String username) {
String key = String.join(":", FAIL_COUNTER, username);
Integer count = redisTemplate.opsForValue().get(key);
redisTemplate.opsForValue().increment(key);
if (count == null) {
redisTemplate.expire(key, 10, TimeUnit.MINUTES);
}
if (count!=null&&count.intValue() > 5) {
lock(username);
}
}
public void deleteLoginFailCounter(String username) {
redisTemplate.delete(String.join(":", FAIL_COUNTER, username));
}
public void lock(String username) {
String key = String.join(":", FAIL_LOCK, username);
redisTemplate.opsForValue().set(key, 1, 30, TimeUnit.MINUTES);
}
public boolean isLock(String username) {
return redisTemplate.hasKey(String.join(":", FAIL_LOCK, username));
}
public long unlockTime(String username) {
String key = String.join(":", FAIL_LOCK, username);
return redisTemplate.opsForValue().getOperations().getExpire(key, TimeUnit.MINUTES);
}
public Result loginCheck(String username, String password) {
User user = userMapper.queryByName(username);
Integer passwordStr = redisTemplate.opsForValue().get(username);
if (password.equals(passwordStr)) {
return Result.success();
} else {
if (user != null) {
if (user.getPassword().equals(password)) {
redisTemplate.opsForValue().set(username, Integer.valueOf(password));
return Result.success().setErrmsg("用户名密码正确登录成功");
} else {
log.error("===========用户名密码对应错误{}==========", "密码错误");
return Result.failed();
}
} else {
log.error("========用户名密码对应错误{}=========", "用户名错误");
return Result.failed();
}
}
}
@Override
public Result login(String username, String password) {
boolean lock = isLock(username);
if (lock) {
long outtime = unlockTime(username);
return new Result().setSuccess(false).setErrmsg("账号已经被锁定,请于"+outtime+"分钟后解锁");
}
Result result = loginCheck(username, password);
if (!result.isSuccess()) {
setCheckFailCounter(username);
return new Result();
}
deleteLoginFailCounter(username);
return new Result();
}
}