本文实例讲述了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>
更多关于asp.net相关内容感兴趣的读者可查看本站专题:《asp.net文件操作技巧汇总》、《asp.net ajax技巧总结专题》及《asp.net缓存操作技巧总结》。
希望本文所述对大家asp.net程序设计有所帮助。