1. 程式人生 > 實用技巧 >StringBoot+redis-使用者登陸限制密碼輸入次數(超出後禁用兩個小時)

StringBoot+redis-使用者登陸限制密碼輸入次數(超出後禁用兩個小時)

一、為啥使用redis來限制密碼輸入次數

使用mysql等關係型資料庫也可以完成禁用,但是沒有定時的功能,而redis資料庫自帶的定時刪除功能。

二、實現思路

使用者輸入密碼錯誤後,就自動在redis資料庫中增加一條資料,資料內容為key+value,key是使用者名稱,value是錯誤次數,每次出錯,更新value,直到value等於3,給這個鍵值對加上失效時間即可。

登陸的時候需要判斷使用者的value是否為3,如果為3查出失效時間返回給前臺

三、程式碼實現

只拿出service層的程式碼:

 /**
  *  @author: wsq
  *  @Date: 2020/7/22 12:30
  *  @Description: 使用者登陸模組,三次輸入錯誤禁用2小時
  
*/ public String login(Map<String, Object> map){ // 判斷該賬號是否存在 Map<String, Object> admin = redisMapper.login(map); if(admin == null){ return "此賬號不存在!"; } // 判斷賬號是否已經禁用 int failCount = 0; if(redisTemplate.opsForValue().get(map.get("account").toString()+"FailCount") != null
){ failCount = Integer.parseInt(redisTemplate.opsForValue().get(map.get("account").toString()+"FailCount").toString()); } if(failCount == 3){ long lockTime = redisTemplate.getExpire(map.get("account").toString()+"FailCount"); return "此賬號已被禁用,禁用剩餘時間為:"+lockTime+"秒"; }
// 判斷使用者名稱密碼是否正確 if (!(admin.get("password").toString().equals(map.get("password").toString()))){ redisTemplate.opsForValue().set(map.get("account")+"FailCount",++failCount); if(failCount == 3){ redisTemplate.opsForValue().set(map.get("account")+"FailCount",failCount,60*60*2, TimeUnit.SECONDS); return "此賬號已被禁用,禁用時間為2個小時!"; } return "輸入密碼錯誤,請重新輸入,你可以再次嘗試的次數為:"+ (3 - failCount); } return "登陸成功"; }