zoukankan      html  css  js  c++  java
  • asp.net : 拒绝频繁的IP访问

    //首先我们要实现 IHttpModule接口

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Web;
    using System.Web.UI;
    using System.Web.SessionState;
    using System.Configuration;

    namespace MyHttp
    {
        public class UrlReWrite : IHttpModule
        {
            /// <summary>
            /// 单个IP最大连接限制数量
            /// </summary>
            private int rowCount = Convert.ToInt32(ConfigurationSettings.AppSettings["HttpRowCount"]);
            /// <summary>
            /// 指定区域时间范围 单位分
            /// </summary>
            private int httpTime = Convert.ToInt32(ConfigurationSettings.AppSettings["HttpTime"]);

            public void Init(HttpApplication application)
            {
                application.BeginRequest += (new
                     EventHandler(this.Application_BeginRequest));
                application.EndRequest += (new
                     EventHandler(this.Application_EndRequest));

            }
            private void Application_BeginRequest(Object source, EventArgs e)
            {
                HttpApplication Application = (HttpApplication)source;
                HttpContext ctx = Application.Context;
                //IP地址
                string isIp = ctx.Request.UserHostAddress;
                if (ctx.Application["time"] == null)
                {
                    ctx.Application["time"] = DateTime.Now;
                }
                else
                {
                    DateTime isTime = (DateTime)ctx.Application["time"];
                    int timeTract = Convert.ToInt32(DateTime.Now.Subtract(isTime).Minutes.ToString());
                    if (timeTract > (httpTime - 1))
                    {
                        ctx.Application["time"] = null;
                        ctx.Application["myip"] = null;
                    }
                }
                if (ctx.Application["myip"] != null && ctx.Application["myip"] is CartIp)
                {
                    CartIp cartIp = (CartIp)ctx.Application["myip"];
                    cartIp.Insert(isIp);
                    ctx.Application["myip"] = cartIp;
                    if (cartIp.GetCount(isIp) > rowCount)
                    {
                        ctx.Response.Clear();
                        ctx.Response.Close();
                    }
                }
                else
                {
                    CartIp cartIp = new CartIp();
                    cartIp.Insert(isIp);
                    HttpContext.Current.Application["myip"] = cartIp;
                }
            }

            private void Application_EndRequest(Object source, EventArgs e)
            {

            }  

            public void Dispose()
            {

            }

        }
    }

    //ListIp 类

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace MyHttp
    {
        [Serializable]
        public class ListIp
        {
            private string ip;
            private int count;
            /// <summary>
            /// IP地址
            /// </summary>
            public string IP
            {
                get { return ip; }
                set { ip = value; }
            }
            /// <summary>
            /// 累加数量
            /// </summary>
            public int Count
            {
                get { return count; }
                set { count = value; }
            }
        }
        [Serializable]
        public class CartIp
        {
            public CartIp()
            {
                if (_listIp == null)
                {
                    _listIp = new List<ListIp>();
                }
            }
            private List<ListIp> _listIp;
            public List<ListIp> _ListIp
            {
                get { return _listIp; }
                set { _listIp = value; }
            }
            /// <summary>
            /// 添加IP
            /// </summary>
            public void Insert(string ip)
            {
                int indexof = ItemLastInfo(ip);
                if (indexof == -1)
                {
                    //不存在
                    ListIp item = new ListIp();
                    item.IP = ip;
                    _listIp.Add(item);
                }
                else
                {
                    _listIp[indexof].Count += 1;
                }
            }
            //判断IP是否存在
            public int ItemLastInfo(string ip)
            {
                int index = 0;
                foreach (ListIp item in _ListIp)
                {
                    if (item.IP == ip)
                    {
                        return index;//存在
                    }
                    index += 1;
                }
                return -1;//不存在
            }
            /// <summary>
            /// 获得IP的数量
            /// </summary>
            /// <param name="ip"></param>
            /// <returns></returns>
            public int GetCount(string ip)
            {
                foreach (ListIp item in _ListIp)
                {
                    if (item.IP == ip)
                    {
                        return item.Count;//存在
                    }
                }
                return -1;//不存在
            }
        }
    }

    //在web.config 配置访问规则

    <appSettings>

    <add key="HttpRowCount" value="100"/>
    <add key="HttpTime" value="10"/>

    </appSettings>

    <system.web>

       <httpModules>
       <add name="UrlReWrite" type="MyHttp.UrlReWrite"/>
      </httpModules>
    </system.web>

  • 相关阅读:
    apply call bind方法的区别和含义
    html头部meta标签
    语义化标签
    “文件名和url路径名”命名要点以及大小写问题
    BMP GIF PNG JPG等图片格式的区别和适用情况
    前端页面的性能优化
    js阻止默认事件,如a标签跳转和事件冒泡
    散列碰撞问题的解决——开链法(拉链法)
    substring()方法
    对学生成绩进行散列
  • 原文地址:https://www.cnblogs.com/Fooo/p/2878820.html
Copyright © 2011-2022 走看看