龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

ASP.NET使用HttpModule实现IP地址屏蔽功能(源码)(3)

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
源代码: using System; using System . Collections . Generic; using System . Linq; using System . Web; using System . Net; namespace MySite { public class IPFilter : IHttpModule { void context_Acqu

源代码:

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版本:

image

精彩图集

赞助商链接