1.场景描述

在日常开发接口的时候,尤其是restfull接口,肯定会考虑安全或者是做一些自定义的限制,用来界定并维护代码。那么,我们都会采用什么方法那?通常来讲,我们可以通过session的形式,以访问者的ip为键来记录用户对某接口访问的次数,并对其作出限制。在.net中还可以将session或者是MemoryCache来替换session来实现(另外也可以用第三方nosql:如redis、Mongodb等)。本文结合redis予以实现。

2.实现分析

通常来说,我们会可以在每一个需要被限制的接口使用redis来存储记录当前来访客户端访问的次数,这样,便可以实现我们想要的效果。但是,少啦可以,如果说,日后很多接口都需要限制该怎么办呐,我们该如何去整理并统筹规划呐?答案就是:可以采用Action过滤器标签的的形式,这样,我们只需封装这样可以限制访问的一个公用的过滤器标签,在需要被限制的地方加上标签,便可以得到我们想要的效果。废话不多说,直接上代码!!!

 public class ApiLimitFilter : ActionFilterAttribute
{
#region 可配参数
//标识前缀(唯一)
private string redisKeyPrefix;
public string RedisKeyPrefix
{
get
{
if (string.IsNullOrEmpty(redisKeyPrefix))
{
redisKeyPrefix = "Api_limit";
} return redisKeyPrefix;
}
set { redisKeyPrefix = value; }
}
//显示时间长度
private TimeSpan? timeSpan { get; set; }
public TimeSpan? TimeSpan
{
get
{
if (timeSpan == null)
{
timeSpan = System.TimeSpan.FromDays();
}
return timeSpan;
}
set { timeSpan = value; }
}
//显示次数
private int limitCount;
public int LimitCount
{
get
{
if (limitCount <= )
{
limitCount = ;
} return limitCount;
}
set { limitCount = value; }
}
//提示语
private string notify;
public string Notify
{
get
{
if (string.IsNullOrEmpty(notify))
{
notify = "请求受限";
} return notify;
}
set { notify = value; }
}
#endregion
#region 内部私用
private string RedisKey
{
get { return string.Format("{0}_{1}", redisKeyPrefix, IpUtil.GetHostAddress()); }
}
private int currentCount = ;
#endregion
#region Limit
/// <summary>
/// 限制过滤
/// </summary>
/// <param name="actionContext"></param>
public override void OnActionExecuting(HttpActionContext actionContext)
{
//获取接口访问次数(redis封装的工具类/可切换自己想要的东西)
currentCount = RedisCacheHelper.Instance.Get<int>(RedisKey);
if (currentCount > LimitCount)
{
var resultModel = new ResultModel(, Notify);
actionContext.Response=actionContext.Request.CreateResponse(HttpStatusCode.OK, resultModel); }
base.OnActionExecuting(actionContext);
}
/// <summary>
/// 限制追记
/// </summary>
/// <param name="actionExecutedContext"></param>
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
currentCount++;
//记住访问痕迹(redis封装的工具类/可切换自己想要的东西)
RedisCacheHelper.Instance.Set(RedisKey, currentCount, TimeSpan);
base.OnActionExecuted(actionExecutedContext);
}
#endregion
}

api接口访问限制的更多相关文章

  1. API接口访问频次限制 / 网站恶意爬虫限制 / 网站恶意访问限制 方案

    API接口访问频次限制 / 网站恶意爬虫限制 / 网站恶意访问限制 方案 采用多级拦截,后置拦截的方式体系化解决 1 分层拦截 1.1 第一层 商业web应用防火墙(WAF) 直接用商业服务 传统的F ...

  2. Postman如何通过xmysql工具的Restful API 接口访问MySQL

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 有时候用 Postman 接口测试需要获取MySQL的查询结果做接口输出的校验,这里介绍下 Postman 通过 R ...

  3. 熟练掌握HDFS的Java API接口访问

    HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件(可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:She ...

  4. 掌握HDFS的Java API接口访问

    HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件(可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:She ...

  5. Winform混合式开发框架访问Web API接口的处理

    在我的混合式开发框架里面,集成了WebAPI的访问,这种访问方式不仅可以实现简便的数据交换,而且可以在多种平台上进行接入,如Winform程序.Web网站.移动端APP等多种接入方式,Web API的 ...

  6. API接口设计

    1.场景描述 比如说我们要做一款APP,需要通过api接口给app提供数据.假设我们是做商城,比如我们卖书的.我们可以想象下这个APP大概有哪些内容: 1)首页:banner区域(可以是一些热门书籍的 ...

  7. 如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问。

    由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题. 刚开始没做任何处理,用jsonp的方式调用 web api 接口, ...

  8. Asp.Net Web Api 接口,拥抱支持跨域访问。

    如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问. 由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题 ...

  9. 一次php访问sql server 2008的API接口的采坑

    2018年6月21日17:17:09,注意:不是详细文档,新手可能会看不懂 windows下安装 项目是sql server 2008的k3,php连接数据库写的API,因为是买的时候是别人的程序,测 ...

随机推荐

  1. java 获取pdf内容

    1. 说明 将pdf中的文字读取处理还有一些限制:1. 文档的安全属性不能过于严格 2. 不能存在图片. 2. 直接贴相关的源码 有两种读取方式,maven对应的pom文件 <dependenc ...

  2. jQuery ztree 自制一套 灰蓝皮肤

    jQuery ztree 自制一套 灰蓝皮肤 PNG图片替换官方ztree下img文件中的png图片即可

  3. 代码题(14)— 合并有序链表、数组、合并K个排序链表

    1.21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出 ...

  4. Windows Server 2008 R2 备份与恢复详细实例

    Windows Server 2008 R2中Windows Server Backup备份与恢复 本实验是在虚拟机操作,因公司的需求,将备份存储到另一台服务器,于是我在现有linux备份服务器搭建了 ...

  5. Spring源码分析_01_ idea搭建spring源码阅读环境

    二.参考资料 1.Intellij Idea如何导入spring源码

  6. queryRuner如何获得bean对象,当这个bean对象中包含其他对象的时候

    我们知道我们可以使用dbutil的QueryRunner下的query方法使用BeanHandler得到bean对象 但是,当我们在一个表和另一个表关联的时候,往往喜欢将另一个表的关联字段变成另一个b ...

  7. linux命令学习笔记(3):pwd命令

    Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时, 你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置 ...

  8. TypeError: 'str' object is not callable

    Python报错TypeError: 'str' object is not callable

  9. 8th

    2017-2018-2 20179212<网络攻防实践>第8周作业 视频学习 Kali权限维持之后门 权限维持包含Tunnel工具集.Web后门.系统后门三个子类.其中系统后门与web后门 ...

  10. 【LeetCode】033. Search in Rotated Sorted Array

    题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...