一、產生背景

之前的隨筆提到過專案中寫了一鍵登入功能、上線後除了有時候網路波動會導致登陸失敗,其他情況一直穩如老狗

しかし,郵件看到有人惡意刷一鍵登入,這年頭閒的人可真閒啊,

只能思考如何搞一搞

二、解決思路

因為專案實現一鍵登入採用的是 自有伺服器呼叫 所以限制一鍵登入分為兩步走,因為每個手機號有唯一的openid所以拿openid做redis的key值

(1)、呼叫雲函式之前

呼叫雲函式之前,前端會發起請求給後臺,拿到這個請求後去 Redis 中檢查2小時的登入次數如果大於設定閾值就返回限制一鍵登入次數,否則就放行通過

(2)、呼叫雲函式

呼叫時使用Redis的 setNX()(命令在指定的 key 不存在時,為 key 設定指定的值,這種情況下等同 SET 命令。當 key存在時,什麼也不做。)因為第一次不存在key所以設定一個初始值和過期時間。接下來使用Redis的 incrBy() 使value自增,每次呼叫value就+1。

三、上手編碼

(1)、呼叫雲函式前編碼

public static void checkOneLogin(String openid) {
if (StringUtils.isBlank(openid)) {
"引數校驗,丟擲自定義異常即可";
}
//從Redis獲取該使用者半小時內登入次數
String s = RedisHelper.get(RedisHelper.get(openid));
//如果為空直接返回
if (StringUtils.isBlank(s)){
return;
}
//如果redis儲存OpenId並且 value大於10丟擲異常
if (Integer.parseInt(s) >= 10) {
log.info("[日誌]使用者{}在{}因一鍵登入次數過多,被暫時禁止一鍵登入",openid,new Date());
"記錄日誌,丟擲異常";
}
}

(2)、呼叫雲函式編碼

public static void oneLoginOK(String openid) {
//首次進入賦予預設值
boolean nx = RedisHelper.setNx(RedisHelper.get(openid), "1", 60 * 30);
//首次進入返回
if (nx) {
return;
}
//登入成功自增1
Long incr = RedisHelper.incrBy(RedisHelper.get(openid));
if (incr >= 10) {
//設定過期時間
RedisHelper.expire(RedisHelper.get(openid), 60 * 60 * 2);
}
}

寫的不是很規範,實際開發要加Redis頭等 總的來說遇到的問題也不老少,還有云函式記憶體不夠的情況、、網路稍有問題也會出現問題~~~