婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > redis 實現(xiàn)登陸次數(shù)限制的思路詳解

redis 實現(xiàn)登陸次數(shù)限制的思路詳解

熱門標簽:高碑店市地圖標注app 南京手機外呼系統(tǒng)廠家 400電話辦理的口碑 b2b外呼系統(tǒng) 廊坊外呼系統(tǒng)在哪買 地圖標注工廠入駐 四川穩(wěn)定外呼系統(tǒng)軟件 一個地圖標注多少錢 臺灣電銷

title: redis-login-limitation 

利用 redis 實現(xiàn)登陸次數(shù)限制, 注解 + aop, 核心代碼很簡單.

基本思路

比如希望達到的要求是這樣: 在 1min 內(nèi)登陸異常次數(shù)達到5次, 鎖定該用戶 1h

那么登陸請求的參數(shù)中, 會有一個參數(shù)唯一標識一個 user, 比如 郵箱/手機號/userName

用這個參數(shù)作為key存入redis, 對應的value為登陸錯誤的次數(shù), string 類型, 并設(shè)置過期時間為 1min. 當獲取到的 value == "4" , 說明當前請求為第 5 次登陸異常, 鎖定.

所謂的鎖定, 就是將對應的value設(shè)置為某個標識符, 比如"lock", 并設(shè)置過期時間為 1h

核心代碼

定義一個注解, 用來標識需要登陸次數(shù)校驗的方法

package io.github.xiaoyureed.redispractice.anno;
import java.lang.annotation.*;
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RedisLimit {
  /**
   * 標識參數(shù)名, 必須是請求參數(shù)中的一個
   */
  String identifier();
  /**
   * 在多長時間內(nèi)監(jiān)控, 如希望在 60s 內(nèi)嘗試
   * 次數(shù)限制為5次, 那么 watch=60; unit: s
   */
  long watch();
  /**
   * 鎖定時長, unit: s
   */
  long lock();
  /**
   * 錯誤的嘗試次數(shù)
   */
  int times();
}

編寫切面, 在目標方法前后進行校驗, 處理...

package io.github.xiaoyureed.redispractice.aop;
@Component
@Aspect
// Ensure that current advice is outer compared with ControllerAOP
// so we can handling login limitation Exception in this aop advice.
//@Order(9)
@Slf4j
public class RedisLimitAOP {
  @Autowired
  private StringRedisTemplate stringRedisTemplate;
  @Around("@annotation(io.github.xiaoyureed.redispractice.anno.RedisLimit)")
  public Object handleLimit(ProceedingJoinPoint joinPoint) {
    MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
    final Method   method     = methodSignature.getMethod();
    final RedisLimit redisLimitAnno = method.getAnnotation(RedisLimit.class);// 貌似可以直接在方法參數(shù)中注入 todo
    final String identifier = redisLimitAnno.identifier();
    final long  watch   = redisLimitAnno.watch();
    final int  times   = redisLimitAnno.times();
    final long  lock    = redisLimitAnno.lock();
    // final ServletRequestAttributes att       = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
    // final HttpServletRequest    request     = att.getRequest();
    // final String          identifierValue = request.getParameter(identifier);
    String identifierValue = null;
    try {
      final Object arg      = joinPoint.getArgs()[0];
      final Field declaredField = arg.getClass().getDeclaredField(identifier);
      declaredField.setAccessible(true);
      identifierValue = (String) declaredField.get(arg);
    } catch (NoSuchFieldException e) {
      log.error(">>> invalid identifier [{}], cannot find this field in request params", identifier);
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
    if (StringUtils.isBlank(identifierValue)) {
      log.error(">>> the value of RedisLimit.identifier cannot be blank, invalid identifier: {}", identifier);
    }
    // check User locked
    final ValueOperationsString, String> ssOps = stringRedisTemplate.opsForValue();
    final String             flag = ssOps.get(identifierValue);
    if (flag != null  "lock".contentEquals(flag)) {
      final BaseResp result = new BaseResp();
      result.setErrMsg("user locked");
      result.setCode("1");
      return new ResponseEntity>(result, HttpStatus.OK);
    }
    ResponseEntity result;
    try {
      result = (ResponseEntity) joinPoint.proceed();
    } catch (Throwable e) {
      result = handleLoginException(e, identifierValue, watch, times, lock);
    }
    return result;
  }
  private ResponseEntity handleLoginException(Throwable e, String identifierValue, long watch, int times, long lock) {
    final BaseResp result = new BaseResp();
    result.setCode("1");
    if (e instanceof LoginException) {
      log.info(">>> handle login exception...");
      final ValueOperationsString, String> ssOps = stringRedisTemplate.opsForValue();
      Boolean                exist = stringRedisTemplate.hasKey(identifierValue);
      // key doesn't exist, so it is the first login failure
      if (exist == null || !exist) {
        ssOps.set(identifierValue, "1", watch, TimeUnit.SECONDS);
        result.setErrMsg(e.getMessage());
        return new ResponseEntity>(result, HttpStatus.OK);
      }
      String count = ssOps.get(identifierValue);
      // has been reached the limitation
      if (Integer.parseInt(count) + 1 == times) {
        log.info(">>> [{}] has been reached the limitation and will be locked for {}s", identifierValue, lock);
        ssOps.set(identifierValue, "lock", lock, TimeUnit.SECONDS);
        result.setErrMsg("user locked");
        return new ResponseEntity>(result, HttpStatus.OK);
      }
      ssOps.increment(identifierValue);
      result.setErrMsg(e.getMessage() + "; you have try " + ssOps.get(identifierValue) + "times.");
    }
    log.error(">>> RedisLimitAOP cannot handle {}", e.getClass().getName());
    return new ResponseEntity>(result, HttpStatus.OK);
  }
}

這樣使用:

package io.github.xiaoyureed.redispractice.web;
@RestController
public class SessionResources {
  @Autowired
  private SessionService sessionService;
  /**
   * 1 min 之內(nèi)嘗試超過5次, 鎖定 user 1h
   */
  @RedisLimit(identifier = "name", watch = 30, times = 5, lock = 10)
  @RequestMapping(value = "/session", method = RequestMethod.POST)
  public ResponseEntityLoginResp> login(@Validated @RequestBody LoginReq req) {
    return new ResponseEntity>(sessionService.login(req), HttpStatus.OK);
  }
}

references

https://github.com/xiaoyureed/redis-login-limitation

總結(jié)

以上所述是小編給大家介紹的redis 實現(xiàn)登陸次數(shù)限制的思路詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

您可能感興趣的文章:
  • PHP+Redis 消息隊列 實現(xiàn)高并發(fā)下注冊人數(shù)統(tǒng)計的實例
  • 利用Redis統(tǒng)計網(wǎng)站在線活躍用戶的方法
  • PHP使用redis實現(xiàn)統(tǒng)計緩存mysql壓力的方法
  • Redis中統(tǒng)計各種數(shù)據(jù)大小的方法
  • 基于redis實現(xiàn)token驗證用戶是否登陸
  • redis開啟和禁用登陸密碼校驗的方法
  • 基于Redis位圖實現(xiàn)系統(tǒng)用戶登錄統(tǒng)計

標簽:泰州 定州 畢節(jié) 南寧 甘南 拉薩 伊春 河源

巨人網(wǎng)絡通訊聲明:本文標題《redis 實現(xiàn)登陸次數(shù)限制的思路詳解》,本文關(guān)鍵詞  redis,實現(xiàn),登陸,次數(shù),限制,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《redis 實現(xiàn)登陸次數(shù)限制的思路詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于redis 實現(xiàn)登陸次數(shù)限制的思路詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    一本色道**综合亚洲精品蜜桃冫| 一本到高清视频免费精品| 国产一区在线不卡| 久久97超碰色| 免费精品视频在线| 欧美另类久久久品| 三级精品在线观看| 久久精品亚洲一区二区三区浴池| 中文字幕日本不卡| 久久国产精品色| 日本一区二区三区在线观看| 乱中年女人伦av一区二区| 99视频精品全部免费在线| 中文字幕av一区二区三区| 综合在线观看色| 亚洲成人av中文| 日本精品一级二级| 亚洲免费av观看| 中文字幕国产精品一区二区| 制服.丝袜.亚洲.另类.中文| 精品久久久网站| 国产精品夜夜嗨| 欧美一区日韩一区| 日本一区中文字幕| 日韩欧美国产精品| 国产专区综合网| 国产日韩精品一区| 欧美丰满少妇xxxxx高潮对白| 国产免费久久精品| 欧美日韩一区二区三区四区五区| 亚洲另类春色国产| 伊人开心综合网| 日韩女优视频免费观看| 美腿丝袜亚洲综合| 日韩一级大片在线观看| 久久福利视频一区二区| 日韩电影在线免费观看| 日韩欧美一区二区视频| 国产精品99久| 午夜私人影院久久久久| 99精品视频免费在线观看| 美女诱惑一区二区| 日韩国产欧美一区二区三区| 丝袜国产日韩另类美女| 色香蕉久久蜜桃| 国产成人自拍在线| 国产激情精品久久久第一区二区 | jiyouzz国产精品久久| 亚洲人成亚洲人成在线观看图片| 884aa四虎影成人精品一区| 国产一区二区免费视频| 亚洲一线二线三线久久久| 日韩一区在线看| 男男gaygay亚洲| 国产成人在线免费| av不卡一区二区三区| 亚洲观看高清完整版在线观看| 亚洲视频狠狠干| 国产拍欧美日韩视频二区| 欧美不卡在线视频| 在线日韩av片| 国内精品伊人久久久久av影院 | 亚洲黄色小视频| 九九精品视频在线看| 亚洲精品免费看| 婷婷开心久久网| 奇米影视一区二区三区小说| 日本高清无吗v一区| 欧美激情一区二区三区蜜桃视频 | 日韩成人精品在线| 日韩精品免费视频人成| 成人性视频免费网站| 亚洲视频一区二区在线| av资源网一区| 久久久电影一区二区三区| 国产亚洲综合av| 日韩一级在线观看| 国产乱码精品一区二区三区av | ww亚洲ww在线观看国产| 亚洲mv在线观看| 欧美视频在线播放| 偷拍日韩校园综合在线| 91色综合久久久久婷婷| 中日韩av电影| 色噜噜久久综合| 亚洲h动漫在线| 国产精品护士白丝一区av| 国产精品久久久爽爽爽麻豆色哟哟 | 在线一区二区三区四区五区| 久久精品一区二区| 国产精品素人一区二区| 国产精品1区二区.| 欧美成人一区二区| 综合久久久久久久| 成人午夜激情影院| 一区二区在线观看视频| 国产乱人伦偷精品视频免下载| 午夜私人影院久久久久| 91伊人久久大香线蕉| 人人精品人人爱| 777xxx欧美| 亚洲国产成人精品视频| 国产91丝袜在线播放0| 国内精品免费**视频| av资源网一区| 国产福利精品导航| 久久综合久久鬼色| 婷婷成人激情在线网| 久久久久国产免费免费| 中文字幕一区二区三区不卡在线 | 精品99久久久久久| 欧美丝袜第三区| 国产精品国产精品国产专区不蜜| 国产99久久久国产精品| 欧美极品美女视频| 欧美久久久久久久久久| 国产精品护士白丝一区av| 欧美麻豆精品久久久久久| 久久天天做天天爱综合色| 日韩欧美国产系列| 欧美在线免费观看亚洲| 色又黄又爽网站www久久| 午夜精品福利在线| 97aⅴ精品视频一二三区| 亚洲日本免费电影| 色激情天天射综合网| 欧美视频第二页| 日韩欧美国产精品| 日韩一区二区三区在线观看 | 久久超碰97中文字幕| 久久久久久久久蜜桃| 久久亚洲私人国产精品va媚药| 中文字幕国产精品一区二区| 91原创在线视频| 欧美一级精品在线| 日本道在线观看一区二区| 国产精品538一区二区在线| 国产九色sp调教91| 日韩电影一区二区三区四区| 国产精品久久久久久亚洲毛片 | 裸体健美xxxx欧美裸体表演| 欧美日韩高清一区二区三区| 欧美巨大另类极品videosbest | 一本一本久久a久久精品综合麻豆| 风间由美中文字幕在线看视频国产欧美 | 亚洲国产精品久久人人爱蜜臀| 欧美午夜精品一区二区三区| 日韩欧美一级二级三级久久久| 99久久久久久| 国产精品久久三区| 日韩欧美一级二级| 国产亚洲va综合人人澡精品| 欧美国产在线观看| 精品国产免费人成在线观看| 色噜噜狠狠成人网p站| 久久理论电影网| 亚洲国产日产av| 成人av网站大全| 欧美一区二区在线视频| 久久99精品久久只有精品| 久久久久国产精品麻豆ai换脸 | 亚洲一卡二卡三卡四卡无卡久久| 不卡一区二区在线| 日韩精品福利网| 午夜精品成人在线| 99精品黄色片免费大全| 精品视频在线免费看| 欧美色网站导航| 777午夜精品视频在线播放| 亚洲国产一区二区三区| 久久99久久久久| 成人精品一区二区三区四区| 精一区二区三区| 久久久久国产精品麻豆ai换脸 | 中文一区在线播放| 成人网男人的天堂| 国产精品一区二区91| 精品动漫一区二区三区在线观看| 中文字幕精品一区| 午夜精品久久久久| 欧美不卡视频一区| 欧美国产精品中文字幕| ●精品国产综合乱码久久久久| 国产一区二区三区蝌蚪| 青青草国产精品亚洲专区无| 91黄色免费网站| 在线看一区二区| 亚洲免费观看高清完整版在线观看| 99久久国产综合精品色伊| 成人国产精品免费| 亚洲精品亚洲人成人网| 卡一卡二国产精品 | 欧美亚一区二区| 国产亚洲综合在线| 欧美三级资源在线| 成人黄色小视频| 亚洲美女屁股眼交| 色综合网站在线| 亚洲精品成人精品456| 欧美网站一区二区|