本文实例讲述了asp.net实现拒绝频繁的IP访问的方法。分享给大家供大家参考,具体如下:
首先我们要实现 IHttpModule接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
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 类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
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 配置访问规则
1
2
3
4
5
6
7
8
9
|
< 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程序设计有所帮助。