优纳美食网
您的当前位置:首页asp.net实现拒绝频繁的IP访问的方法

asp.net实现拒绝频繁的IP访问的方法

来源:优纳美食网


本文实例讲述了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程序设计有所帮助。

显示全文