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