web api 限制单个IP在一定时间内访问次数
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在一定时间内访问次数相关推荐
- 前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查
首页 > 技术 > 编程 > NET > 前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查 前端使用AngularJS的$res ...
- 关于某日访问次数最多的IP的topK问题的三种解法
题目描述 在july大神的博客中,看到这样两道题: 1. 海量日志数据,提取出某日访问百度次数最多的那个IP. 2. 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复 ...
- 统计日志中ip访问次数并排序的三种方法
1 利用linux中的awk命令 grep "GET aaa.log | awk -F " " '{print $NF}' >d:/test.log 假设日志的最 ...
- 从1亿个ip中找出访问次数最多的IP
看了教你如何迅速秒杀掉:99%的海量数据处理面试题一文,的确是挺有收获的,特别是对这种海量数据的处理,的确是有了一个挺清晰的思路,特别感谢原文博主July. 处理海量数据问题存在的原因就在于1)数据量 ...
- php限制接口访问次数_令牌桶限流思路分享(PHP+Redis实现机制)
一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...
- 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)
目前最新的代码已经通过Sqlite + NHibernate + Autofac满足了我们基本的Demo需求. 按照既定的要求,我们的API会提供给众多的客户端使用, 这些客户端可以是各种Web站点, ...
- Web Api无法访问 404
最近需要在项目中添加一个Web Api,项目是.net mvc4项目.要想添加一个api,无论你怎么封装,无非就是在Application_Start方法中将WebApi的路由注册进去就行了.例如如下 ...
- linux上设置tomcat下web项目只需要ip地址访问省略端口和项目名称
正常的请求一个项目的路径是:http://ip地址:端口号/项目名. 设置tomcat下conf文件下的server.xml配置文件实现只请求ip地址来访问项目 1 找到server.xml配置文件并 ...
- 网站nginx配置限制单个IP访问频率,预防DDOS恶意攻击
一.简介 对于网站来说,尤其是流量较大出名的网站,经常遇到攻击,如DDOS攻击等,虽然有些第三方,如Cloudflare可以挡,但对于动态网站PHP来说,只能挡一部分.这时候需要对于单个IP恶意攻击做 ...
最新文章
- PCA主成分分析/协方差矩阵
- Linux 搭建SVN 服务器
- vlc播放网络流延时参数设置
- HDU2089——不要62 (数位DP)
- “网页内容无法访问”可能是跨域错误!
- 毕业设计后续工作目标
- 我的面经——投行+咨询+外资银行
- 最新的北京2012年地铁规划图
- 怎样让私服服务器彻底崩溃
- 360P2建html网站,如何自己建网站
- 立方度量(Cubic Metric)
- 解决VMware和VMbox实体机和虚拟机无法复制粘贴的问题
- Flink新特性之非对齐检查点(unaligned checkpoint)简介
- DriverStudio开发PCI设备DMA数据传输
- 一段代码实现WordPress彩色标签云
- 93450C光驱刷机
- Frontiers出版社3月在检SCIESSCI期刊目录出炉
- 还记得当年的α、β、θ和δ吗?
- 总监设计师一夫老师亲授photoshop淘宝美工就业初级阶段到阶段视频课程-王诚-专题视频课程...
- Oracle 11g 在audit_file_dest目录下产生大量的aud文件
热门文章
- “领导跳槽想带我走,我要不要跟?”
- 一周内咸鱼疯转 2.4W 次,最终被所有大厂封杀!
- 意想不到,这个神奇的 Bug 让我加班到深夜
- Sublime Text3常用插件以及安装方法(实用)
- Compass(更新中。。。)
- docker容器内部无法ping通域名?
- Java线程的两种实现方式
- set集合, 深浅拷贝, join, 列表和字典在循环中删除元素的问题, fromkeys( , )
- git如何移除某文件的版本控制
- 不同包下,相同数据结构的两个类进行转换