【转载】ASP.NET网站限制访问频率

来源:互联网 发布:好办软件是什么 编辑:程序博客网 时间:2024/05/16 15:58

【转载】ASP.NET网站限制访问频率

     基本目标:限制同一IP访问网站的频率。比如,我们限制为每240分钟来自同一IP的用户最多只能够访问首页40次、其他页面200次。

     比如您现在可以打开http://freesms.cloudapp.net/ 这个网站试一试,刷新40次,就可以发现您在4小时内无法再次访问到正确的网站内容了。

     基本思想

    1. 用HttpContext.Cache记录访问次数
    2. 将IP值与用户访问方式作为共同的Key,可以对用户的不同访问方式做不同的限制。
    3. 超出限额时调用Response.End()。

    具体代码:

        一、   定义持续时间

               在本例中,我们使用240分钟作为一次限制的时间。

      private const int DURATION = 240   

        二、定义访问方式枚举

    针对不同的访问方式进行不同的限制。在本例中,我们只区分两种访问方式:正常访问与PostBack。在正常应用中,您还可以根据需要增加访问不同页面的限制。

     public enum ActionTypeEnum         {             Normal=40,             Postback=100         }

         三、判断逻辑

    1. 在某IP第一次采用某种访问方式进行访问时,增加Cache的Key=访问方式+IP,返回True
    2. 如果Key已经存在,增加访问次数,返回True
    3. 如果超出次数,返回False
          public static bool IsValid(ActionTypeEnum actionType)            {                HttpContext context = HttpContext.Current;                if (context.Request.Browser.Crawler) return false;                string key = actionType.ToString() + context.Request.UserHostAddress;                int hit = (Int32)(context.Cache[key] ?? 0);                if (hit > (Int32)actionType) return false;                else hit++;                if (hit == 1)                {                    context.Cache.Add(key, hit, null, DateTime.Now.AddMinutes(DURATION), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);                }                else                {                    context.Cache[key] = hit;                }                return true;            }

             四、在页面中调用

      判断函数需要在页面的OnInit方法中调用。在这里需要使用一些自己定义的逻辑,来进行不同访问方式的判断。下面的例子是一个最简单的,只区分正常访问与Postback。

protected override void OnInit(EventArgs e){    base.OnInit(e);    if (!IsPostBack)    {        if (!ActionValidator.IsValid(ActionValidator.ActionTypeEnum.Normal))        {            Response.Write("您发送得太频繁,被系统判断为广告。广告或其他定制业务请联系邮箱admin@cloudera.cn,谢谢。- http://freesms.cloudapp.net");            Response.End();        }    }    else    {        if (!ActionValidator.IsValid(ActionValidator.ActionTypeEnum.Postback))        {            Response.Write("您发送得太频繁,被系统判断为广告。广告或其他定制业务请联系邮箱admin@cloudera.cn,谢谢。- http://freesms.cloudapp.net");            Response.End();        }    }}

 希望本文对您有所帮助!


0 0
原创粉丝点击