zoukankan      html  css  js  c++  java
  • 在ASP.NET MVC下限制同一个IP地址单位时间间隔内的请求次数

    有时候,当用户请求一个Controller下的Action,我们希望,在单位时间间隔内,比如每秒,每分钟,每小时,每天,每星期,限制同一个IP地址对某个Action的请求次数。如何做呢?

    stefanprodan的MvcThrottle能很好地解决这个问题,以及其它类型的IP限制问题。在这里:https://github.com/stefanprodan/MvcThrottle


    把项目从GitHub下载下来,在本地打开。

    找到MvcThrottle类库,打开ThrottlingFilter这个类,在该类的OnActionExecuting方法中修改如下:

                            //check if limit is reached
    
                            if (rateLimit > 0 && throttleCounter.TotalRequests > rateLimit)
    
                            {
    
                                //log blocked request
    
                                if (Logger != null) Logger.Log(ComputeLogEntry(requestId, identity, throttleCounter, rateLimitPeriod.ToString(), rateLimit, filterContext.HttpContext.Request));
    
                                //break execution and return 409 
    
                                var message = string.IsNullOrEmpty(QuotaExceededMessage) ?
    
                                    "HTTP request quota exceeded! maximum admitted {0} per {1}" : QuotaExceededMessage;
    
                                //add status code and retry after x seconds to response
    
                                filterContext.HttpContext.Response.StatusCode = (int)QuotaExceededResponseCode;
    
                                filterContext.HttpContext.Response.Headers.Set("Retry-After", RetryAfterFrom(throttleCounter.Timestamp, rateLimitPeriod));
    
                                filterContext.Result = QuotaExceededResult(
    
                                    filterContext.RequestContext,
    
                                    string.Format(message, rateLimit, rateLimitPeriod),
    
                                    QuotaExceededResponseCode,
    
                                    requestId);
    
                                    
    
                                return;
    
                            }
    

    把以上替换成

                            //check if limit is reached
    
                            if (rateLimit > 0 && throttleCounter.TotalRequests > rateLimit)
    
                            {
    
                                filterContext.HttpContext.Response.Redirect("/Error.html");                               
    
                                return;
    
                            }  

    让其在超过次数时,跳转到项目根目录下的Error.html文件。

    生成该类库,类库MvcThrottle.dll生成在类库的bin/Debug文件夹下。

    在ASP.NET MVC 4 下创建一个项目。

    在项目根目录下创建一个Library文件夹,把刚才的MvcThrottle.dll拷贝其中。

    引用Library文件夹下的MvcThrottle.dll组件。

    在App_Start文件夹中,修改FilterConfig类如下:

        public class FilterConfig
    
        {
    
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    
            {
    
                var throttleFilter = new ThrottlingFilter
    
                {
    
                    Policy = new ThrottlePolicy(perSecond: 1, perMinute: 10, perHour: 60 * 10, perDay: 600 * 10)
    
                    {
    
                        IpThrottling = true
    
                    },
    
                    Repository = new CacheRepository()
    
                };
    
                filters.Add(throttleFilter);
    
            }
    
        }
    

    创建HomeController,编写如下:

        public class HomeController : Controller
    
        {
    
            
    
            public ActionResult Index()
    
            {
    
                return View();
    
            }
    
            [EnableThrottling(PerSecond = 2, PerMinute = 5, PerHour = 30, PerDay = 300)]
    
            public ActionResult Other()
    
            {
    
                return View();
    
            }
    
            [HttpPost]
    
            [EnableThrottling(PerSecond = 2, PerMinute = 5, PerHour = 30, PerDay = 300)]
    
            public ActionResult GetSth()
    
            {
    
                return Json(new {msg=true});
    
            }
    
        }      
    

    生成解决方案。

    报错了!What Happened?

    1

    原来MvcThrottle是ASP.NET MVC 5下开发的。

    有办法。重新打开MvcThrottle项目的类库,在引用中删除原来的System.Web.Mvc,重新引用本地ASP.NET MVC4版本,重新引用本地的System.Web.Mvc。

    重新生成类库,重新拷贝到Library文件夹下,成功生成解决方案。

    在Home/Index.cshtml视图中:

    @{
    
        ViewBag.Title = "Index";
    
        Layout = "~/Views/Shared/_Layout.cshtml";
    
    }
    
    <h2>Index</h2>
    
    <input type="button" id="btn" value="请求"/>
    
    @section scripts
    
    {
    
        <script type="text/javascript">
    
            $(function() {
    
                $('#btn').on("click", function() {
    
                    $.post('@Url.Action("GetSth")',function(data) {
    
                        if (data.msg) {
    
                            alert("请求成功一次");
    
                        } else {
    
                            alert("请求次数过多");
    
                        }
    
                    });
    
                });
    
            });
    
        </script>
    
    }
    

    当在单位时间间隔内超过规定次数,就弹出"请求次数过多"提示框。

    在Home/Other.cshtml视图中:

    @{
    
        ViewBag.Title = "Other";
    
        Layout = "~/Views/Shared/_Layout.cshtml";
    
    }
    
    <h2>Other</h2>
    

    当在单位时间间隔内超过规定次数,就跳转到预定的Error.html页了。

  • 相关阅读:
    LSMW TIPS
    Schedule agreement and Delfor
    Running VL10 in the background 13 Oct
    analyse idoc by creation date
    New Journey Prepare
    EDI error
    CBSN NEWS
    Listen and Write 18th Feb 2019
    Microsoft iSCSI Software Target 快照管理
    通过 Microsoft iSCSI Software Target 提供存储服务
  • 原文地址:https://www.cnblogs.com/darrenji/p/4446767.html
Copyright © 2011-2022 走看看