ASP.NET MVC限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)的請(qǐng)求次數(shù)
有時(shí)候,當(dāng)用戶請(qǐng)求一個(gè)Controller下的Action,我們希望,在單位時(shí)間間隔內(nèi),比如每秒,每分鐘,每小時(shí),每天,每星期,限制同一個(gè)IP地址對(duì)某個(gè)Action的請(qǐng)求次數(shù)。如何做呢?
stefanprodan的MvcThrottle能很好地解決這個(gè)問題,以及其它類型的IP限制問題。在這里:https://github.com/stefanprodan/MvcThrottle
把項(xiàng)目從GitHub下載下來,在本地打開。
找到MvcThrottle類庫,打開ThrottlingFilter這個(gè)類,在該類的OnActionExecuting方法中修改如下:
//check if limit is reachedif (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 reachedif (rateLimit > 0 && throttleCounter.TotalRequests > rateLimit){ filterContext.HttpContext.Response.Redirect("/Error.html"); return;}
讓其在超過次數(shù)時(shí),跳轉(zhuǎn)到項(xiàng)目根目錄下的Error.html文件。
生成該類庫,類庫MvcThrottle.dll生成在類庫的bin/Debug文件夾下。
在ASP.NET MVC 4 下創(chuàng)建一個(gè)項(xiàng)目。
在項(xiàng)目根目錄下創(chuàng)建一個(gè)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);} }
創(chuàng)建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});} }
生成解決方案。
報(bào)錯(cuò)了!What Happened?
原來MvcThrottle是ASP.NET MVC 5下開發(fā)的。
有辦法。重新打開MvcThrottle項(xiàng)目的類庫,在引用中刪除原來的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="請(qǐng)求"/>@section scripts{ <script type="text/javascript">$(function() { $("#btn").on("click", function() {$.post("@Url.Action("GetSth")",function(data) { if (data.msg) {alert("請(qǐng)求成功一次"); } else {alert("請(qǐng)求次數(shù)過多"); }}); });}); </script>}
當(dāng)在單位時(shí)間間隔內(nèi)超過規(guī)定次數(shù),就彈出"請(qǐng)求次數(shù)過多"提示框。
在Home/Other.cshtml視圖中:
@{ ViewBag.Title = "Other"; Layout = "~/Views/Shared/_Layout.cshtml";}<h2>Other</h2>
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章:
1. ASP.NET MVC獲取多級(jí)類別組合下的產(chǎn)品2. ASP.NET MVC解決上傳圖片臟數(shù)據(jù)的方法3. ASP.NET MVC實(shí)現(xiàn)下拉框多選4. ASP.NET MVC使用typeahead.js實(shí)現(xiàn)輸入智能提示功能5. ASP.NET MVC使用Log4Net記錄異常日志并跳轉(zhuǎn)到靜態(tài)頁6. ASP.NET MVC擴(kuò)展帶驗(yàn)證的單選按鈕7. log4net在Asp.net MVC4中的使用過程8. ASP.NET MVC實(shí)現(xiàn)城市或車型三級(jí)聯(lián)動(dòng)9. ASP.NET MVC通過勾選checkbox更改select的內(nèi)容10. ASP.NET MVC實(shí)現(xiàn)本地化和全球化
