ASP.NET使用HttpModule实现IP地址屏蔽功能(源码)(3)
源代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
namespace MySite
{
public class IPFilter : IHttpModule
{
void context_AcquireRequestState(object sender, EventArgs e)
{
var c = (sender as HttpApplication).Context;
if (c.Session == null) return;
IPAddress ip = null;
if (c.Session["IP"] == null)
{
c.Session["IP"] = ip = IPAddress.Parse(获取客户端IP地址(c));
}
else ip = c.Session["IP"] as IPAddress;
if (c.Cache["IPFilter"] == null) 更新IP屏蔽列表缓存();
var l = c.Cache["IPFilter"] as List<IP地址屏蔽>;
foreach (var f in l)
{
if (f.检测是否被屏蔽(ip))
{
c.Response.Close();
break;
}
}
}
void 更新IP屏蔽列表缓存()
{
using (var c = new DatabaseEntities())
{
var iplist = c.IP地址屏蔽.Where(f => f.过期时间 > DateTime.Now).ToList();
HttpContext.Current.Cache.Insert("IPFilter",
iplist,
null,
DateTime.Now.AddMinutes(3),
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.AboveNormal,
null);
}
}
/// <summary>
/// 获得当前页面客户端的IP
/// </summary>
public static string 获取客户端IP地址(HttpContext c)
{
string result = String.Empty;
result = c.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(result))
{
result = c.Request.ServerVariables["REMOTE_ADDR"];
}
if (string.IsNullOrEmpty(result))
{
result = c.Request.UserHostAddress;
}
if (string.IsNullOrEmpty(result))
{
return "0.0.0.0";
}
return result;
}
#region IHttpModule 成员
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
}
#endregion
}
}
总结来说没什么难度,但是因为这段代码在每次请求中都会执行一次,所以对性能要求很高,如果你有什么优化方面的建议,欢迎提出。
下载本文的XPS版本: