C# 站点IP访问频率限制 针对单个站点的实现方法

站点IP访问频率限制 针对单个站点

using System;
using System.Collections.Generic;
using System.IO;
//using System.Linq;
using System.Web;

// <summary>
// IP访问频率控制
// </summary>
public static class IPCacheManager
{

  /// <summary>
  /// IP缓存集合
  /// </summary>
  private static List<IPCacheInfo> dataList = new List<IPCacheInfo>();
  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 IPCacheManager()
  {
  }

  /// <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"></param>
  /// <returns></returns>
  public static bool CheckIsAble(string ip)
  {
    lock (lockObj)
    {
      var item = dataList.Find(p => p.IP == ip);
      if (item == null)
      {
        item = new IPCacheInfo();
        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
        }
      }
    }
  }
}

public class IPCacheInfo
{
  public string IP { get; set; }

  private List<DateTime> reqTime = new List<DateTime>();
  public List<DateTime> ReqTime
  {
    get { return this.reqTime; }
    set { this.reqTime = value; }
  }
}

以上这篇C# 站点IP访问频率限制 针对单个站点的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C# 站点IP访问频率限制 针对单个站点的实现方法

    站点IP访问频率限制 针对单个站点 using System; using System.Collections.Generic; using System.IO; //using System.Linq; using System.Web; // <summary> // IP访问频率控制 // </summary> public static class IPCacheManager { /// <summary> /// IP缓存集合 /// </summa

  • Django 对IP访问频率进行限制的例子

    REST_FRAMEWORK 配置 对使用 rest_framework 框架的项目来说,可以使用框架的设置来对api的访问频率进行限制 REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': ( 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', 'rest_framework.parsers.MultiPartParser', ), 'DEFAULT_AUTHEN

  • Nginx 如何限制访问频率,下载速率和并发连接数的方法

    一. 限制访问频率.并发连接.下载速度用到的模块和指令概述 ngx_http_limit_req_module :用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket" ngx_http_limit_conn_module :用来限制同一时间连接数,即并发限制 limit_rate和limit_rate_after :下载速度设置 漏桶算法(leaky bucket) 算法思想是: 水(请求)从上方倒入水桶,从水桶下方流出(被处理) 来不及流出的水存在水桶

  • 如何禁止指定指定IP访问我的计算机

    使用IP策略,阻止该ip访问你的任何端口. 下边是方法:你用的是XP吧.应该是的,我就以XP来说! 打开:控制面版--管理工具-本地安全设置.点左边的 IP安全策略,在本地计算机. 然后在右边点右键--创建IP安全策略,打开IP安全策略向导. 下一步,出现IP安全策略名称,随便起个就行.比如叫 阻止192.168.1.163 下一步,出现激活默认响应规则,不要选中,把钩去掉. 下一步,选中编辑属性,完成. 然后出现了 IP安全策略属性,点下边的添加,出现规则属性,点击添加,出现IP策略器列表.把

  • 详解实现Nginx+Tomcat实现单IP、多域名、多站点的访问

    详解实现Nginx+Tomcat实现单IP.多域名.多站点的访问 前言: 最近帮朋友做了两个网站,预算很小很小.小到两个网站只能跑在一台512M内存的公网服务器上(tomcat+MySQL,由于内存太小了,只能把两个网站部署在同一个tomcat上),每个网站有自己的域名,初步考虑使有nginx做反向代理,把两个域名映射到相应的应用上.因此就有了标题所说的"nginx多域名单服务器单IP单Tomcat不同应用"上的配置问题.Nginx介绍的废话就不多说了,在这里把配置文件贴出来给大家参考

  • nginx配置限制同一个ip的访问频率方法

    1.在nginx.conf里的http{}里加上如下代码: limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; 2.在需要限制并发数和下载带宽的网站配置server{}里加上如下代码: limit_conn perip 2; limit_conn perserver 20; limit_rate 100k; 补充说明下参数: $binary_rem

  • Go 如何基于IP限制HTTP访问频率的方法实现

    如果你运行 HTTP 服务,并且希望限制 HTTP 的访问频率,那么你可以借助一些比较稳定的工具,例如: github.com/didip/tollbooth.不过如果你构建的应用比较简单,也可以自己来实现. 我们可以使用一个现有的 Go 包 x/time/rate. 本课程,我们将创建一个简单的中间件实现基于 IP 限制 HTTP 访问频率. 简单的 HTTP 服务 让我们从创建一个简单的 HTTP 服务开始,它有非常简单的终端. 但是,因为它的访问频率可能非常高,因此我们要为它添加频率限制.

  • nginx禁止某个IP访问站点的设置方法

    首先建立下面的配置文件放在nginx的conf目录下面,命名为blocksip.conf: deny 95.105.25.181; 保存一下. 在nginx的配置文件nginx.conf中加入:include blocksip.conf; 重启一下nginx的服务:/usr/local/nginx/sbin/nginx -s reload 就可以生效了. blocksip.conf:的格式还有许多种,可以配置只允许的IP访问或者IP段访问: deny IP; allow IP; # block

  • 在nginx中实现单位时间内限制访问频率的教程

    首先说一下遇到这个问题是因为网站被攻击,阿里云报警,想到要限制一下访问频率,而不是限制ip(限制ip的方案稍后给出).nginx连接资源被吃空返回状态码是502,添加本方案限制后返回599,与正常状态码区别开. 步骤如下: 首先nginx.conf里面添加如下内容: map $http_x_forwarded_for $clientRealIp { "" $remote_addr; ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr; } #

  • 禁止IP访问网站的多种方法分享(linux,php,nginx,apache)

    PHP禁止某个IP或IP段访问 废话不多说,客官请看: <? //禁止某个IP $banned_ip = array ( "127.0.0.1", //"119.6.20.66", "192.168.1.4" ); if ( in_array( getenv("REMOTE_ADDR"), $banned_ip ) ) { die ("您的IP禁止访问!"); } //禁止某个IP段 $ban_ran

随机推荐