C#.NET 大型企業信息化系統集成快速開發平臺 4.2 版本 - 訪問頻率限制功能實現、防止黑客掃描、防止惡意刷屏

不少軟件組件,你們都能想到了,你們也能作出來,可是成熟穩定、可靠、易用、功能全面,可信任,可相信,可開源就不是很容易,須要樹立良好的口碑才能夠。redis

1:每每會有黑客,進行撞庫挖掘漏洞,不少系統的帳戶有可能被猜想出密碼來,會存在嚴重的安全問題。數據庫

2:所有加上圖片驗證碼等,用戶體驗比較差,每天用的用戶會很難受。安全

3:惡意刷屏、大數據查詢有惡意查詢時,服務器進入惡性循環,數據庫壓力會過大,爲了防止進入惡性循環,能控制調用頻率比較好。服務器

4:對外,對內提供接口調用時,合做夥伴,內部接口調用頻率太高時,服務器的壓力會多大,網絡流量也會過大,系統進入惡性循環。網絡

5:爲了有良性的信息系統,有強大的組件支撐,能夠保證整個生態系統的平穩運行。函數

 

調用方法以下:大數據

bool result = false; result = DotNet.Business.PooledRedisHelper.CallLimit("ip, 手機,url", 50, 5);url

System.Console.WriteLine("result:" + result.ToString());spa

限制調用次數的功能,作了一個通用的函數,如有須要歡迎你們使用。code

什麼資源,多少分鐘內,限制調用多少次。 全自動的,返回 true, 表示,已經到達了限制次數了, false 能夠繼續調用的意思。

 

//-----------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2015 , Hairihan TECH, Ltd. 
//-----------------------------------------------------------------

using System;
using System.Configuration;
using ServiceStack.Redis;

namespace DotNet.Business
{
    /// <summary>
    /// 調用頻率限制獨立的庫。
    ///
    /// 修改紀錄
    ///
    ///        2015-09-25 版本:1.0 JiRiGaLa 建立主鍵。
    ///
    /// <author>
    ///        <name>JiRiGaLa</name>
    ///        <date>2015-09-25</date>
    /// </author>
    /// </summary>
    public sealed partial class PooledRedisHelper
    {
        // 數據庫
        public static int InitialDbCallLimit = 78;

        private static PooledRedisClientManager instanceCallLimit = null;

        public static PooledRedisClientManager InstanceCallLimit
        {
            get
            {
                if (instanceCallLimit == null)
                {
                    if (ConfigurationManager.AppSettings["RedisHosts"] != null)
                    {
                        Url = ConfigurationManager.AppSettings["RedisHosts"];
                    }
                    if (string.IsNullOrEmpty(Url))
                    {
                        Url = "redis.ztosys.com:6379";
                    }
                    instanceCallLimit = new PooledRedisClientManager(InitialDbCallLimit, new string[] { Url });
                }
                return instanceCallLimit;
            }
        }

        public static IRedisClient GetCallLimitClient()
        {
            return InstanceCallLimit.GetClient();
        }

        /// <summary>
        /// 是否在指定的時間內,已經到了呼叫限制次數
        /// 什麼鍵名,什麼鍵值,在多少時間內,限制調用幾回
        /// 2015-09-25 吉日嘎拉
        /// </summary>
        /// <param name="keyName">鍵名</param>
        /// <param name="minutes">過時時間,多少時間裏</param>
        /// <param name="limit">限制次數</param>
        /// <returns>是否超過限制</returns>
        public static bool CallLimit(string keyName, int minutes, int limit)
        {
            return CallLimit(keyName, DateTime.Now.AddMinutes(minutes), limit);
        }

        public static bool CallLimit(string keyName, DateTime expireAt, int limit)
        {
            bool result = false;

            using (var redisClient = PooledRedisHelper.GetUserClient())
            {
                if (redisClient.ContainsKey(keyName))
                {
                    result = redisClient.IncrementValue(keyName) > limit;
                }
                else
                {
                    redisClient.IncrementValue(keyName);
                    // 設置過時時間
                    redisClient.ExpireEntryAt(keyName, expireAt);
                }
            }

            return result;
        }
    }
}
相關文章
相關標籤/搜索