api接口访问限制
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接口访问限制的更多相关文章
- API接口访问频次限制 / 网站恶意爬虫限制 / 网站恶意访问限制 方案
API接口访问频次限制 / 网站恶意爬虫限制 / 网站恶意访问限制 方案 采用多级拦截,后置拦截的方式体系化解决 1 分层拦截 1.1 第一层 商业web应用防火墙(WAF) 直接用商业服务 传统的F ...
- Postman如何通过xmysql工具的Restful API 接口访问MySQL
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 有时候用 Postman 接口测试需要获取MySQL的查询结果做接口输出的校验,这里介绍下 Postman 通过 R ...
- 熟练掌握HDFS的Java API接口访问
HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件(可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:She ...
- 掌握HDFS的Java API接口访问
HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件(可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:She ...
- Winform混合式开发框架访问Web API接口的处理
在我的混合式开发框架里面,集成了WebAPI的访问,这种访问方式不仅可以实现简便的数据交换,而且可以在多种平台上进行接入,如Winform程序.Web网站.移动端APP等多种接入方式,Web API的 ...
- API接口设计
1.场景描述 比如说我们要做一款APP,需要通过api接口给app提供数据.假设我们是做商城,比如我们卖书的.我们可以想象下这个APP大概有哪些内容: 1)首页:banner区域(可以是一些热门书籍的 ...
- 如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问。
由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题. 刚开始没做任何处理,用jsonp的方式调用 web api 接口, ...
- Asp.Net Web Api 接口,拥抱支持跨域访问。
如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问. 由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题 ...
- 一次php访问sql server 2008的API接口的采坑
2018年6月21日17:17:09,注意:不是详细文档,新手可能会看不懂 windows下安装 项目是sql server 2008的k3,php连接数据库写的API,因为是买的时候是别人的程序,测 ...
随机推荐
- java语法糖---枚举
java语法糖---枚举 在JDK5.0中提供了大量的语法糖,例如:自动装箱拆箱.增强for循环.枚举.泛型等.所谓“语法糖”就是指提供更便利的语法供程序员使用,只是在编译器上做了手脚,却没有提供 ...
- Java -- AWT , GUI图形界面
1. AWT 容器继承关系 示例1: public class Main { public static void main(String[] args) throws Exception { Fra ...
- PHP消息队列用法实例分析
这篇文章主要介绍了PHP消息队列用法,结合实例形式分析了PHP消息队列用于Linux下进程间通信的相关技巧,需要的朋友可以参考下 该消息队列用于linux下,进程通信 队列状态信息:具体参考手册
- appium-环境搭建(二)
接着上一篇 1.基本的python环境 2.安装node.js,32位还是64位根据自己的系统来选择 3.安装.net framwork4.5 4.安装appium 安装完成后,运行appium.ex ...
- Java_异常_05_ OutOfMemoryError: Java heap space
一.异常现象: 二.异常原因 JAVA的堆栈设置太小 注: 出现此异常之后,会引发其他的问题. 三.异常解决 手动设置Heap size: 修改 TOMCAT_HOME/bin/catalina.sh ...
- ADO:游标与RecordSetPtr
一.游标的属性设置: 游标是记录集recordset中用于游动逐个查找一条记录的一种机制.查询的数据返回后,通过游标来逐条获取查询的记录. 因此在配置数据库查询方式前可配置游标的属性: rs.Curs ...
- JavaWEB - 静态include指令、动态Include指令
(一)使用静态include指令 <%@ page language="java" contentType="text/html; charset=gb2312&q ...
- windows下面的python的MySQLdb环境安装
什么是MySQLdb? MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的. 如何安装MySQ ...
- C语言小程序(三)、判断两个日期之差
输入两个日期,计算之间相差多少天. 用了两种方法实现,第二种利用结构体,代码比较清晰,其余的都一样. 1.普通的写法 #include <stdio.h> int leapyear(int ...
- c/c++写的比较好的读写配置文件的函数或者类
共用版 .h文件 //---------------------------------------------------------------------------- // 程序名称: ...