大家好,一個人見人愛,花見花開的小白來跟大家分享來了,敲黑板,現在大多數應用以及網頁登錄都有登錄失敗鎖定用戶一段時間不讓登錄這一說,那么究竟是怎么實現呢,一起來看一下吧
首先說以下主題邏輯,然后貼代碼
- 首先驗證登錄賬號的有效性,是否存在,如果存在繼續下一步,不存在直接丟給前端不存在。
- 判斷redis中代表用戶登錄失敗的key(在下面代碼里面,key用的是兩個用戶賬號拼接成的字符串)是否存在。
- 如果存在,則代表這個用戶不是第一次因密碼錯誤登錄失敗了,之后利用定義好的key去獲取value,value用字符串存儲,轉成數值類型加一。
- 如果不存在,但是密碼錯誤,則用定義好的key 給到redis里面,value給成字符串1。
- 下次登錄時,便首先判斷key是否存在,如存在判斷錯誤次數,超過上限直接返回。
@Autowired
private UserDao userDaoImpl;
//注入RedisTemplate
@Autowired
private RedisTemplate<String,String> redisTemplate;
//驗證用戶登錄方法
public String verifyUserPassword(User user) {
//獲取redis中對String字符串操作的對象
ValueOperations<String, String> valueOperations= redisTemplate.opsForValue();
//boos為判斷redis中是否有此key存在
Boolean boos;
//失敗或成功提示語
String str = "";
//1.首先驗證賬號的有效性,懶得驗證了,大家結合自己的驗證以下就好
//驗證此key是否存在,如果存在判斷錯誤次數是否大於等於5,如果大於等於,則直接返回,不進行下面邏輯,否則繼續進行
boos = redisTemplate.hasKey(user.getUseraccount()+user.getUseraccount());
if(boos){
//根據key獲取錯誤次數
if(Integer.parseInt(valueOperations.get(user.getUseraccount()+user.getUseraccount()))>=5){
return "用戶已被鎖定";
}
}
//2.根據賬號獲取密碼
String password = userDaoImpl.queryUserPassword(user);
//用輸入密碼與數據庫密碼比對
Boolean boo = password.equals(user.getPassword());
if(boo){
str ="密碼正確";
}
//密碼錯誤進行redis操作
if(!boo){
str ="密碼錯誤";
//3.證明密碼錯誤
if(boos){
//如果boos為true,則證明redis中有此key,獲取key的數值並加1
Integer inte = Integer.parseInt(valueOperations.get(user.getUseraccount()+user.getUseraccount()));
inte++;
valueOperations.set(user.getUseraccount()+user.getUseraccount(), inte+"");
}else{
//boos為flase,則證明redis中沒有此key,密碼是第一次錯誤,故走以下邏輯
valueOperations.set(user.getUseraccount()+user.getUseraccount(), 1+"");
//redis中設置key的過期時間
redisTemplate.expire(user.getUseraccount()+user.getUseraccount(), 300, TimeUnit.SECONDS);
}
//判斷錯誤次數,大於等於5次鎖定
if(Integer.parseInt(valueOperations.get(user.getUseraccount()+user.getUseraccount()))>=5){
//redis中設置key的過期時間
redisTemplate.expire(user.getUseraccount()+user.getUseraccount(), 300, TimeUnit.SECONDS);
str ="密碼錯誤5次,賬號被鎖定五分鍾";
}
}
//如果密碼相同,則看redis中是否有錯誤次數,如果有則刪除
boos = redisTemplate.hasKey(user.getUseraccount()+user.getUseraccount());
if(boo){
redisTemplate.delete(user.getUseraccount()+user.getUseraccount());
}
return str;
}
以上就是主要代碼了,有更好方法的評論在下方哦!