• 简单的限流过滤器


    API接口都是提供给第三方服务/客户端调用,所有请求地址以及请求参数都是暴露给用户的。

    每次请求一个HTTP请求,用户都可以通过F12,或者抓包工具看到请求的URL链接,然后copy出来。这样是非常不安全的,有人可能会恶意的刷我们的接口,那这时该怎么办呢?

    增加一个全局过滤器 获取客户端的IP  限制固定时间内的访问次数即可

    第一步:创建全局过滤器 RateLimitFilter

    复制代码
     public class RateLimitFilter : ActionFilterAttribute
        {
            private const int MaxRequests = 30; //1分钟访问最大频率
            private bool StartUp = true; //是否启用
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                if (StartUp)
                {
                    base.OnActionExecuting(context);
                    string clientId = GetIP();
                    if (GetCache(clientId) == null)
                    {
                        SetCacheRelativeTime(clientId, 1, 60);
                    }
                    else
                    {
                        var cs = int.Parse(GetCache(clientId).ToString());
                        SetCacheRelativeTime(clientId, cs += 1, 60);
                    }
                    //var x = int.Parse(GetCache(clientId).ToString());
                    if (int.Parse(GetCache(clientId).ToString()) > MaxRequests)
                    {
                        //返回值规范不统一
                        context.Result = new ContentResult { Content = "

    " + clientId + " 访问过于频繁,请稍等片刻!

    " }; //返回值规范统一 前端有错误提示 //context.Result = new JsonResult() //{ // Data = new { Result = false, status = false, suc = false, message = "" + clientId + " 访问过于频繁,请稍等片刻!" }, // JsonRequestBehavior = JsonRequestBehavior.AllowGet //}; } } } /// /// 获取客户端IP地址 /// /// 若失败则返回回送地址 public static string GetIP() { //如果客户端使用了代理服务器,则利用HTTP_X_FORWARDED_FOR找到客户端IP地址 string userHostAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (!string.IsNullOrEmpty(userHostAddress)) { userHostAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString().Split(',')[0].Trim(); } //否则直接读取REMOTE_ADDR获取客户端IP地址 if (string.IsNullOrEmpty(userHostAddress)) { userHostAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; } //前两者均失败,则利用Request.UserHostAddress属性获取IP地址,但此时无法确定该IP是客户端IP还是代理IP if (string.IsNullOrEmpty(userHostAddress)) { userHostAddress = HttpContext.Current.Request.UserHostAddress; } //最后判断获取是否成功,并检查IP地址的格式(检查其格式非常重要) if (!string.IsNullOrEmpty(userHostAddress) && IsIP(userHostAddress)) { return userHostAddress; } return "127.0.0.1"; } /// /// 检查IP地址格式 /// /// /// public static bool IsIP(string ip) { return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"); } #region 设置相对过期时间Cache值(即:访问激活后不过期) /// /// 设置相对过期时间Cache值(即:访问激活后不过期) /// /// /// /// 超过多少时间不调用就失效,单位是秒 public static void SetCacheRelativeTime(string objectkey, object objObject, int timeSpan) { System.Web.Caching.Cache objCache = HttpRuntime.Cache; objCache.Insert(objectkey, objObject, null, DateTime.MaxValue, TimeSpan.FromSeconds(timeSpan)); } #endregion #region 获取当前应用程序指定CacheKey的Cache值 /// /// 获取当前应用程序指定CacheKey的Cache值 /// /// /// y public static object GetCache(string CacheKey) { try { System.Web.Caching.Cache objCache = HttpRuntime.Cache; Object value = objCache[CacheKey]; if (value != null) { return value; } else { return null; } } catch (Exception) { return null; } } #endregion }

    复制代码

     

    第二步:FilterConfig类并注册你的全局过滤器

    复制代码
     public class FilterConfig
     {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                filters.Add(new RateLimitFilter()); // 过滤器
            }
     }
    复制代码

    第三步:Global.asax 文件中注册全局过滤器

    复制代码
    protected void Application_Start()
    {
                AreaRegistration.RegisterAllAreas();
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
                UnityConfig.RegisterComponents();
    
                // 注册全局过滤器
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    
    }
    复制代码

     

  • 相关阅读:
    Java基础之ArrayList集合(最简单最详细)
    java 实现删除单链表中所有指定的结点以及如何清空单链表
    java计算机毕业设计基于springboo+vue的房产出租销售门户网站(房屋租赁系统源代码+数据库+Lw文档)
    微信私域运营工具CRM
    蓝桥杯:真题讲解1(C++版)附带解析
    微信小程序项目实例SSM农产品销售系统|商城|电商系统+后台
    Jina AI创始人肖涵博士解读多模态AI的范式变革
    我月入160刀的app,朋友要5万块买走,卖不卖?
    【云原生之Docker实战】容器的资源限制使用方法
    虚拟 DOM:前端性能优化的秘密
  • 原文地址:https://www.cnblogs.com/zj19940610/p/18244414