2019独角兽企业重金招聘Python工程师标准>>>

ps:下面实例是每隔30秒访问次数不超过3次

1、Filter:

using Infrastructure.Log;
using Infrastructure.Web;
using Lemon.Stats.Model;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;namespace Lemon.Stats.Apis
{/// <summary>/// 限制单个IP短时间内访问次数/// </summary>[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]public class IPActionFilterAttribute : ActionFilterAttribute{/// <summary>/// 限制单个IP短时间内访问次数/// </summary>/// <param name="actionContext"></param>public override void OnActionExecuting(HttpActionContext actionContext){string ip = HttpHelper.GetClientIp(actionContext.Request);//var isValid = IPCacheHelper.CheckIsAble(ip);IPCacheInfoModel ipModel =  IPCacheHelper.GetIPLimitInfo(ip);if (!ipModel.IsVisit){Logger.Warn(string.Format("IP【{0}】被限制了【{1}】次数",ipModel.IP,ipModel.Limit));actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, "系统正忙,请稍微再试。");return;}base.OnActionExecuting(actionContext);}}
}

2、IPCacheHelper:

using Lemon.Stats.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Lemon.Stats.Apis
{/// <summary>/// 限制单个IP访问次数/// </summary>public class IPCacheHelper{/// <summary>         /// IP缓存集合          /// </summary>       private static List<IPCacheInfoModel> dataList = new List<IPCacheInfoModel>();private static object lockObj = new object();/// <summary>        /// 一段时间内,最大请求次数,必须大于等于1///</summary> private static int maxTimes = 3;/// <summary>  /// 一段时间长度(单位秒),必须大于等于1     /// </summary>private static int partSecond = 30;/// <summary>  /// 请求被拒绝是否加入请求次数    /// </summary>  private static bool isFailAddIn = false;static IPCacheHelper(){ }/// <summary>      /// 设置时间,默认maxTimes=3, partSecond=30         /// </summary>        /// <param name="_maxTimes">最大请求次数</param>        /// <param name="_partSecond">请求单位时间</param>         public static void SetTime(int _maxTimes, int _partSecond){maxTimes = _maxTimes;partSecond = _partSecond;}/// <summary>    /// 检测一段时间内,IP的请求次数是否可以继续请求和使用  /// </summary>        /// <param name="ip">ip</param>   /// <returns></returns>       public static bool CheckIsAble(string ip){lock (lockObj){var item = dataList.Find(p => p.IP == ip);if (item == null){item = new IPCacheInfoModel();item.IP = ip;item.ReqTime.Add(DateTime.Now);dataList.Add(item);return true;}else{if (item.ReqTime.Count > maxTimes){item.ReqTime.RemoveAt(0);}var nowTime = DateTime.Now;if (isFailAddIn){#region 请求被拒绝也需要加入当次请求item.ReqTime.Add(nowTime);if (item.ReqTime.Count >= maxTimes){if (item.ReqTime[0].AddSeconds(partSecond) > nowTime){return false;}else{return true;}}else{return true;}#endregion}else{#region 请求被拒绝就不需要加入当次请求了if (item.ReqTime.Count >= maxTimes){if (item.ReqTime[0].AddSeconds(partSecond) > nowTime){return false;}else{item.ReqTime.Add(nowTime);return true;}}else{item.ReqTime.Add(nowTime);return true;}#endregion}}}}/// <summary>    /// 检测一段时间内,IP的请求次数是否可以继续请求和使用  /// </summary>        /// <param name="ip">ip</param>   /// <returns></returns>       public static IPCacheInfoModel GetIPLimitInfo(string ip){lock (lockObj){var item = dataList.Find(p => p.IP == ip);if (item == null) //IP开始访问{item = new IPCacheInfoModel();item.IP = ip;item.ReqTime.Add(DateTime.Now);dataList.Add(item);item.IsVisit = true; //可以继续访问return item;}else{if (item.ReqTime.Count > maxTimes){item.ReqTime.RemoveAt(0);}var nowTime = DateTime.Now;if (isFailAddIn){#region 请求被拒绝也需要加入当次请求item.ReqTime.Add(nowTime);if (item.ReqTime.Count >= maxTimes){if (item.ReqTime[0].AddSeconds(partSecond) > nowTime){item.Limit++; //限制次数+1item.IsVisit = false;//不能继续访问return item;}else{item.IsVisit = true; //可以继续访问return item; //单个IP30秒内 没有多次访问}}else{item.IsVisit = true; //可以继续访问return item; //单个IP访问次数没有达到max次数}#endregion}else{#region 请求被拒绝就不需要加入当次请求了if (item.ReqTime.Count >= maxTimes){if (item.ReqTime[0].AddSeconds(partSecond) > nowTime){item.Limit++; //限制次数+1item.IsVisit = false;//不能继续访问return item;}else{item.ReqTime.Add(nowTime);item.IsVisit = true; //可以继续访问return item;}}else{item.ReqTime.Add(nowTime);item.IsVisit = true; //可以继续访问return item;}#endregion}}}}}
}

3、IPCacheInfoModel:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Lemon.Stats.Model
{public class IPCacheInfoModel{/// <summary>/// IP /// </summary>public string IP { get; set; }/// <summary>/// 限制次数/// </summary>public int Limit { get; set; }/// <summary>/// 是否可以访问/// </summary>public bool IsVisit { get; set; }/// <summary>/// 访问时间/// </summary>private List<DateTime> reqTime = new List<DateTime>();/// <summary>/// 访问时间/// </summary>public List<DateTime> ReqTime{get { return this.reqTime; }set { this.reqTime = value; }}}
}

4、Action:

/// <summary>/// IP,PV(VV),UV,注册用户点击量统计/// 先执行IPActionFilter过滤器,再执行ChannelActionFilter过滤器/// 先执行后面的过滤器,再执行前面的过滤器,执行方式倒序执行顺序/// </summary>[ChannelActionFilter, IPActionFilter, RoutePrefix("Stats")]public class StatsController : ApiController{/// <summary>/// 每次页面点击都统计数据,直接由客户端调用/// Header中加入SecretKey,AppKey,UniqueKey/// </summary>/// <returns></returns>[HttpGet, Route("")]public async Task Get(){}}

转载于:https://my.oschina.net/u/200350/blog/3004526

web api 限制单个IP在一定时间内访问次数相关推荐

  1. 前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查

    首页 > 技术 > 编程 > NET > 前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查 前端使用AngularJS的$res ...

  2. 关于某日访问次数最多的IP的topK问题的三种解法

    题目描述 在july大神的博客中,看到这样两道题: 1. 海量日志数据,提取出某日访问百度次数最多的那个IP. 2. 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复 ...

  3. 统计日志中ip访问次数并排序的三种方法

    1  利用linux中的awk命令 grep "GET aaa.log | awk -F " " '{print $NF}' >d:/test.log 假设日志的最 ...

  4. 从1亿个ip中找出访问次数最多的IP

    看了教你如何迅速秒杀掉:99%的海量数据处理面试题一文,的确是挺有收获的,特别是对这种海量数据的处理,的确是有了一个挺清晰的思路,特别感谢原文博主July. 处理海量数据问题存在的原因就在于1)数据量 ...

  5. php限制接口访问次数_令牌桶限流思路分享(PHP+Redis实现机制)

    一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...

  6. 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)

    目前最新的代码已经通过Sqlite + NHibernate + Autofac满足了我们基本的Demo需求. 按照既定的要求,我们的API会提供给众多的客户端使用, 这些客户端可以是各种Web站点, ...

  7. Web Api无法访问 404

    最近需要在项目中添加一个Web Api,项目是.net mvc4项目.要想添加一个api,无论你怎么封装,无非就是在Application_Start方法中将WebApi的路由注册进去就行了.例如如下 ...

  8. linux上设置tomcat下web项目只需要ip地址访问省略端口和项目名称

    正常的请求一个项目的路径是:http://ip地址:端口号/项目名. 设置tomcat下conf文件下的server.xml配置文件实现只请求ip地址来访问项目 1 找到server.xml配置文件并 ...

  9. 网站nginx配置限制单个IP访问频率,预防DDOS恶意攻击

    一.简介 对于网站来说,尤其是流量较大出名的网站,经常遇到攻击,如DDOS攻击等,虽然有些第三方,如Cloudflare可以挡,但对于动态网站PHP来说,只能挡一部分.这时候需要对于单个IP恶意攻击做 ...

最新文章

  1. PCA主成分分析/协方差矩阵
  2. Linux 搭建SVN 服务器
  3. vlc播放网络流延时参数设置
  4. HDU2089——不要62 (数位DP)
  5. “网页内容无法访问”可能是跨域错误!
  6. 毕业设计后续工作目标
  7. 我的面经——投行+咨询+外资银行
  8. 最新的北京2012年地铁规划图
  9. 怎样让私服服务器彻底崩溃
  10. 360P2建html网站,如何自己建网站
  11. 立方度量(Cubic Metric)
  12. 解决VMware和VMbox实体机和虚拟机无法复制粘贴的问题
  13. Flink新特性之非对齐检查点(unaligned checkpoint)简介
  14. DriverStudio开发PCI设备DMA数据传输
  15. 一段代码实现WordPress彩色标签云
  16. 93450C光驱刷机
  17. Frontiers出版社3月在检SCIESSCI期刊目录出炉
  18. 还记得当年的α、β、θ和δ吗?
  19. 总监设计师一夫老师亲授photoshop淘宝美工就业初级阶段到阶段视频课程-王诚-专题视频课程...
  20. Oracle 11g 在audit_file_dest目录下产生大量的aud文件

热门文章

  1. “领导跳槽想带我走,我要不要跟?”
  2. 一周内咸鱼疯转 2.4W 次,最终被所有大厂封杀!
  3. 意想不到,这个神奇的 Bug 让我加班到深夜
  4. Sublime Text3常用插件以及安装方法(实用)
  5. Compass(更新中。。。)
  6. docker容器内部无法ping通域名?
  7. Java线程的两种实现方式
  8. set集合, 深浅拷贝, join, 列表和字典在循环中删除元素的问题, fromkeys( , )
  9. git如何移除某文件的版本控制
  10. 不同包下,相同数据结构的两个类进行转换