亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

redis防止短信惡意調(diào)用的實(shí)現(xiàn)

 更新時間:2025年02月06日 10:07:08   作者:Gopfei  
本文主要介紹了在場景登錄或注冊接口中使用短信驗(yàn)證碼時遇到的惡意調(diào)用問題,并通過使用Redis分布式鎖來解決,具有一定的參考價值,感興趣的可以了解一下

1.場景

登錄或注冊接口中,使用短信驗(yàn)證碼場景時,遇到惡意調(diào)用短信接口,一毫秒多次調(diào)用,導(dǎo)致短信資源大幅度消耗。

2.排查

經(jīng)排查發(fā)現(xiàn),短信發(fā)送接口無限制,僅通過redis保留驗(yàn)證碼發(fā)送信息。一個時間戳產(chǎn)生數(shù)次甚至十幾次調(diào)用,多個線程同時訪問redis后,取值相同,均通過驗(yàn)證前往調(diào)用短信接口。

3.解決方案

使用redis分布式鎖,解決該問題。

相關(guān)代碼如下:

3.1 redis鎖實(shí)現(xiàn)

public class RedisLock {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    private static final Long NX = 1L; // 超時時間

    public boolean tryLock(String key, String value) {
		// 超時時間單位,這里發(fā)現(xiàn),較新版本的RedisTemplate中,setIfAbsent方法時間單位為TimeUnit,并非大多帖子中表述的Long類型
        TimeUnit timeUnit = TimeUnit.MINUTES; 

        // 這里設(shè)置redis鎖超時時間為1分鐘
        Boolean result = redisTemplate.opsForValue().setIfAbsent(key, value, NX, timeUnit);
        return result != null && result;
    }

    // unlock方法未測試,請測試后再使用
    public void unlock(String key, String value) {
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
                "return redis.call('del', KEYS[1]) " +
                "else " +
                "return 0 " +
                "end";
        redisTemplate.execute((RedisCallback<Boolean>) connection -> {
            Object nativeConnection = connection.getNativeConnection();
            if (nativeConnection instanceof Jedis) {
                return ((Jedis) nativeConnection).eval(script, Collections.singletonList(key), Collections.singletonList(value)).equals(1L);
            } else if (nativeConnection instanceof RedisClusterConnection) {
                return ((RedisClusterConnection) nativeConnection).eval(script.getBytes(), ReturnType.INTEGER, 1, key.getBytes(), value.getBytes()).equals(1L);
            }
            return false;
        });
    }
}

3.2 方法調(diào)用

	public boolean getVerfityCode(String mobile) {

        String smsCode = ShareCodeUtils.smsCode();

        // redis鎖參數(shù)
        String lockKey = "sms_lock_" + mobile;
        String lockValue = UUID.randomUUID().toString();

        boolean send = false;

        try {
            if (redisLock.tryLock(lockKey, lockValue)) {
                // 獲取鎖成功,觸發(fā)短信驗(yàn)證碼功能(具體邏輯,此處因原登錄邏輯需要redis支持,故保留)
                String s = redisUtils.get(RedisKeys.VERFITY_CODE + mobile);
                if (s != null) {
                    // 判斷驗(yàn)證碼是否過期
                    throw new ServiceException("驗(yàn)證碼未過期,請勿重復(fù)獲取");
                }
                // 發(fā)送驗(yàn)證碼
                send = smsBaoUtil.sendSms(mobile, smsCode);
                if (send) {
                    // reids 中不存在 此電話對應(yīng)驗(yàn)證碼證明已經(jīng)過了 verCodeTm 秒,則可以重新生成
                    redisUtils.set(RedisKeys.VERFITY_CODE + mobile, smsCode, verCodeTm);
        }
            }
        } catch (Exception e) {
            send = false;
        }
        // 很多帖子這里會增加finally解鎖邏輯,這里為了保證1分鐘內(nèi)不會再觸發(fā)短信惡意調(diào)用,取消解鎖邏輯,由redis超時銷毀后,自動解鎖。
        return send;
    }

到此這篇關(guān)于redis防止短信惡意調(diào)用的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)redis防止短信惡意調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 完美解決Redis在雙擊redis-server.exe出現(xiàn)閃退問題

    完美解決Redis在雙擊redis-server.exe出現(xiàn)閃退問題

    本文主要介紹了完美解決Redis在雙擊redis-server.exe出現(xiàn)閃退問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Spark刪除redis千萬級別set集合數(shù)據(jù)實(shí)現(xiàn)分析

    Spark刪除redis千萬級別set集合數(shù)據(jù)實(shí)現(xiàn)分析

    這篇文章主要為大家介紹了Spark刪除redis千萬級別set集合數(shù)據(jù)實(shí)現(xiàn)過程分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 一起raid數(shù)據(jù)恢復(fù)及回遷成功的案例

    一起raid數(shù)據(jù)恢復(fù)及回遷成功的案例

    這篇文章主要介紹了一起raid數(shù)據(jù)恢復(fù)及回遷成功的案例,需要的朋友可以參考下
    2017-04-04
  • redis使用zset實(shí)現(xiàn)延時隊列的示例代碼

    redis使用zset實(shí)現(xiàn)延時隊列的示例代碼

    本文主要介紹了redis使用zset實(shí)現(xiàn)延時隊列的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Redis分布式緩存與秒殺

    Redis分布式緩存與秒殺

    這篇文章主要介紹了Redis分布式緩存與秒殺,單點(diǎn)Redis的問題,主要有數(shù)據(jù)丟失,并發(fā)能力,故障恢復(fù),存儲能力,想進(jìn)一步了解的同學(xué),可以借鑒本文
    2023-04-04
  • redis中使用bloomfilter的白名單功能解決緩存穿透問題

    redis中使用bloomfilter的白名單功能解決緩存穿透問題

    本文主要介紹了redis中使用bloomfilter的白名單功能解決緩存穿透問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • redis 限制內(nèi)存使用大小的實(shí)現(xiàn)

    redis 限制內(nèi)存使用大小的實(shí)現(xiàn)

    這篇文章主要介紹了redis 限制內(nèi)存使用大小的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Redis 有序集合的使用場景

    Redis 有序集合的使用場景

    在Redis的學(xué)習(xí)中,有序集合是一種非常實(shí)用的數(shù)據(jù)結(jié)構(gòu),本文就來介紹一下Redis 有序集合的使用場景,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • RedisTemplate批量操作工具類性能測試

    RedisTemplate批量操作工具類性能測試

    這篇文章主要為大家介紹了RedisTemplate批量操作工具類性能測試詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)

    redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)

    本文主要介紹了redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10

最新評論