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页了。

  • 相关阅读:
    AJAX基础
    DOM事件机制(事件捕获和事件冒泡和事件委托)
    http协议
    DOM实战-js todo
    python常见面试题
    jQuery快速入门
    三级菜单
    购物车
    员工信息表
    random模块
  • 原文地址:https://www.cnblogs.com/darrenji/p/4446767.html
Copyright © 2011-2022 走看看